Const Buffer,Texture Buffer

本文介绍了ConstBufferPool中请求缓冲区的方法,并详细探讨了如何使用HlmsPbsDatablock与ConstBufferPool来填充缓冲区的具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

申请缓冲区

void ConstBufferPool::requestSlot( uint32 hash, ConstBufferPoolUser *user, bool wantsExtraBuffer )

填充缓冲区

void HlmsPbsDatablock::uploadToConstBuffer( char *dstPtr )

填充缓冲区

void ConstBufferPool::uploadDirtyDatablocks(void)

public initializer(sceneGl: WebGLRenderingContext, sceneProgram: WebGLProgram, sceneOption: FisheyeSceneOption) { this.applyOptions(sceneGl, sceneProgram, sceneOption); const gl = this.gl; gl.pixelStorei(gl.UNPACK_ALIGNMENT, 1); const shaderProgram = this.program; const vertexBuffer = gl.createBuffer(); gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer); gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0]), gl.STATIC_DRAW); const xyLocation = gl.getAttribLocation(shaderProgram, 'xy'); gl.vertexAttribPointer(xyLocation, 2, gl.FLOAT, false, 0, 0); gl.enableVertexAttribArray(xyLocation); const scaleLocation = gl.getUniformLocation(shaderProgram, 'scale'); const scaleFactor = [1, 1]; gl.uniform2fv(scaleLocation, scaleFactor); const translateLocation = gl.getUniformLocation(shaderProgram, 'translate'); const translateFactor = [0, 0]; gl.uniform2fv(translateLocation, translateFactor); const tempStrengthLocation = gl.getUniformLocation(shaderProgram, 'strength'); if (!tempStrengthLocation) return; this.strengthLocation = tempStrengthLocation; gl.uniform1f(this.strengthLocation, this.strengthValue); const texture = gl.createTexture(); const enableMipMap = this.options.isAntialias ? gl.LINEAR_MIPMAP_LINEAR : gl.LINEAR; gl.bindTexture(gl.TEXTURE_2D, texture); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, enableMipMap); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE); gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE); }
06-26
import { SceneOption, Scene, SCENE } from '../gl-renderer/types' import Texture from '../texture' // 目前没有额外配置项,先预留配置项类型,方便后续扩展 export type WebcodecNormalSceneOption = SceneOption<object> /** * @description: 顶点着色器 * @return {*} */ export const vertexShaderSource = ` attribute vec2 xy; uniform vec2 scale; uniform vec2 translate; varying highp vec2 uv; void main(void) { vec2 scaledPosition = xy * scale+ translate; gl_Position = vec4(scaledPosition, 0.0, 1.0); // Map vertex coordinates (-1 to +1) to UV coordinates (0 to 1). // UV coordinates are Y-flipped relative to vertex coordinates. uv = vec2((1.0 + xy.x) / 2.0, (1.0 - xy.y) / 2.0); } ` /** * @description: 片元着色器 * @return {*} */ export const fragmentShaderSource = ` varying highp vec2 uv; uniform sampler2D texture; void main(void) { gl_FragColor = texture2D(texture, uv); } ` export class WebcodecNormalScene extends Scene { static sceneType = SCENE.WEBCODEC_NORMAL vertexShaderSource = vertexShaderSource fragmentShaderSource = fragmentShaderSource gl!: WebGLRenderingContext program!: WebGLProgram options!: WebcodecNormalSceneOption yTexture!: Texture uTexture!: Texture vTexture!: Texture get sceneType() { return WebcodecNormalScene.sceneType } private applyOptions(sceneGl: WebGLRenderingContext, sceneProgram: WebGLProgram, sceneOption: WebcodecNormalSceneOption) { this.gl = sceneGl this.program = sceneProgram this.options = sceneOption } public initializer(sceneGl: WebGLRenderingContext, sceneProgram: WebGLProgram, sceneOption: WebcodecNormalSceneOption) { this.applyOptions(sceneGl, sceneProgram, sceneOption) const gl = this.gl const shaderProgram = this.program const vertexBuffer = gl.createBuffer() gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer) gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0]), gl.STATIC_DRAW) const xyLocation = gl.getAttribLocation(shaderProgram, 'xy') gl.vertexAttribPointer(xyLocation, 2, gl.FLOAT, false, 0, 0) gl.enableVertexAttribArray(xyLocation) const scaleLocation = gl.getUniformLocation(shaderProgram, 'scale') const scaleFactor = [1, 1] // 缩放因子为 1.5x gl.uniform2fv(scaleLocation, scaleFactor) const translateLocation = gl.getUniformLocation(shaderProgram, 'translate') const translateFactor = [0, 0] // 平移因子为 0,0 gl.uniform2fv(translateLocation, translateFactor) //纹理 const texture = gl.createTexture() const enableMipMap = this.options.isAntialias ? gl.LINEAR_MIPMAP_LINEAR : gl.LINEAR gl.bindTexture(gl.TEXTURE_2D, texture) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, enableMipMap) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) } public render(frameData: VideoFrame) { const gl = this.gl gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, frameData) this.options.isAntialias && gl.generateMipmap(gl.TEXTURE_2D) // Configure and clear the drawing area. gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight) gl.clearColor(0.0, 0.0, 0.0, 0.0) gl.clear(gl.COLOR_BUFFER_BIT) gl.drawArrays(gl.TRIANGLE_FAN, 0, 4) } public clear() { const gl = this.gl gl.clearColor(0.0, 0.0, 0.0, 0.0) gl.clear(gl.COLOR_BUFFER_BIT) gl.getExtension('WEBGL_lose_context')?.loseContext() } } 结合这段代码说一下优化的方式
07-05
import { SceneOption, Scene, SCENE } from '../gl-renderer/types'import Texture from '../texture'// 目前没有额外配置项,先预留配置项类型,方便后续扩展export type WebcodecNormalSceneOption = SceneOption<object>/** * @description: 顶点着色器 * @return {*} */export const vertexShaderSource = ` attribute vec2 xy; uniform vec2 scale; uniform vec2 translate; varying highp vec2 uv; void main(void) { vec2 scaledPosition = xy * scale+ translate; gl_Position = vec4(scaledPosition, 0.0, 1.0); // Map vertex coordinates (-1 to +1) to UV coordinates (0 to 1). // UV coordinates are Y-flipped relative to vertex coordinates. uv = vec2((1.0 + xy.x) / 2.0, (1.0 - xy.y) / 2.0); } `/** * @description: 片元着色器 * @return {*} */export const fragmentShaderSource = ` varying highp vec2 uv; uniform sampler2D texture; void main(void) { gl_FragColor = texture2D(texture, uv); } `export class WebcodecNormalScene extends Scene { static sceneType = SCENE.WEBCODEC_NORMAL vertexShaderSource = vertexShaderSource fragmentShaderSource = fragmentShaderSource gl!: WebGLRenderingContext program!: WebGLProgram options!: WebcodecNormalSceneOption yTexture!: Texture uTexture!: Texture vTexture!: Texture get sceneType() { return WebcodecNormalScene.sceneType } private applyOptions(sceneGl: WebGLRenderingContext, sceneProgram: WebGLProgram, sceneOption: WebcodecNormalSceneOption) { this.gl = sceneGl this.program = sceneProgram this.options = sceneOption } public initializer(sceneGl: WebGLRenderingContext, sceneProgram: WebGLProgram, sceneOption: WebcodecNormalSceneOption) { this.applyOptions(sceneGl, sceneProgram, sceneOption) const gl = this.gl const shaderProgram = this.program const vertexBuffer = gl.createBuffer() gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer) gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0]), gl.STATIC_DRAW) const xyLocation = gl.getAttribLocation(shaderProgram, 'xy') gl.vertexAttribPointer(xyLocation, 2, gl.FLOAT, false, 0, 0) gl.enableVertexAttribArray(xyLocation) const scaleLocation = gl.getUniformLocation(shaderProgram, 'scale') const scaleFactor = [1, 1] // 缩放因子为 1.5x gl.uniform2fv(scaleLocation, scaleFactor) const translateLocation = gl.getUniformLocation(shaderProgram, 'translate') const translateFactor = [0, 0] // 平移因子为 0,0 gl.uniform2fv(translateLocation, translateFactor) //纹理 const texture = gl.createTexture() const enableMipMap = this.options.isAntialias ? gl.LINEAR_MIPMAP_LINEAR : gl.LINEAR gl.bindTexture(gl.TEXTURE_2D, texture) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, enableMipMap) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) } public render(frameData: VideoFrame) { const gl = this.gl gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, frameData) this.options.isAntialias && gl.generateMipmap(gl.TEXTURE_2D) // Configure and clear the drawing area. gl.viewport(0, 0, gl.drawingBufferWidth, gl.drawingBufferHeight) gl.clearColor(0.0, 0.0, 0.0, 0.0) gl.clear(gl.COLOR_BUFFER_BIT) gl.drawArrays(gl.TRIANGLE_FAN, 0, 4) } public clear() { const gl = this.gl gl.clearColor(0.0, 0.0, 0.0, 0.0) gl.clear(gl.COLOR_BUFFER_BIT) gl.getExtension('WEBGL_lose_context')?.loseContext() }}以上述代码为例,讲一下webgl渲染视频流性能优化方案
最新发布
07-22
### queueBuffer 和 dequeueBuffer 的详细信息及用法 #### 1. dequeueBuffer 的工作原理与使用方法 `dequeueBuffer` 是 BufferQueue 中的一个关键流程,用于从 BufferQueue 中获取一个空闲的 `GraphicBuffer`,以便在后台进行绘制操作。此过程通常发生在生产者端(Producer),例如应用层的绘图逻辑中。当需要绘制新的内容时,生产者会调用 `dequeueBuffer` 来获取一个可用的缓冲区[^2]。 - **工作原理**: - 如果 BufferQueue 中存在空闲的缓冲区,则直接返回该缓冲区。 - 如果没有空闲缓冲区且队列未满,则创建一个新的缓冲区并返回。 - 如果队列已满,则可能需要等待或丢弃旧的缓冲区(取决于具体实现)。 - **使用方法**: ```cpp status_t SurfaceTexture::dequeueBuffer(sp<GraphicBuffer>* outBuffer, uint32_t* outFenceFd) { // 锁定互斥锁以确保线程安全 Mutex::Autolock _l(mMutex); // 尝试从 BufferQueue 中获取一个空闲缓冲区 if (mBufferQueue->acquireBuffer(outBuffer, outFenceFd) != NO_ERROR) { return UNKNOWN_ERROR; } // 返回成功状态 return NO_ERROR; } ``` 上述代码展示了 `dequeueBuffer` 的基本实现逻辑,其中 `mBufferQueue->acquireBuffer` 负责从队列中获取缓冲区[^1]。 #### 2. queueBuffer 的工作原理与使用方法 `queueBuffer` 是 BufferQueue 中的另一个核心流程,负责将已经绘制完成的 `GraphicBuffer` 传送到消费者端(Consumer),例如 SurfaceFlinger。此过程通常发生在生产者完成绘制后,将缓冲区提交给 SurfaceFlinger 进行进一步处理[^2]。 - **工作原理**: - 生产者完成绘制后调用 `queueBuffer`,将缓冲区传递给消费者。 - 消费者接收到缓冲区后,可以对其进行进一步处理,例如将其转换为纹理并渲染到屏幕上。 - 在某些情况下,消费者可能会拒绝接收缓冲区(例如缓冲区不符合要求),此时需要重新处理或丢弃该缓冲区[^3]。 - **使用方法**: ```cpp status_t SurfaceTexture::queueBuffer(const sp<GraphicBuffer>& buffer, int fenceFd) { // 锁定互斥锁以确保线程安全 Mutex::Autolock _l(mMutex); // 将缓冲区传递给 BufferQueue if (mBufferQueue->releaseBuffer(buffer, fenceFd) != NO_ERROR) { return UNKNOWN_ERROR; } // 返回成功状态 return NO_ERROR; } ``` 上述代码展示了 `queueBuffer` 的基本实现逻辑,其中 `mBufferQueue->releaseBuffer` 负责将缓冲区传递给消费者[^1]。 #### 3. 双缓冲机制的作用 `dequeueBuffer` 和 `queueBuffer` 的配合使用实现了双缓冲机制,确保了绘图操作的流畅性和高效性。具体来说: - `dequeueBuffer` 获取一个空闲的 Back Buffer 用于后台绘制。 - 绘制完成后,通过 `queueBuffer` 将其传递给 Front Buffer 显示。 - 系统通过换页机制切换 Front Buffer 和 Back Buffer,从而实现无缝的图形更新[^2]。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值