diff options
author | Danny Lin <danny@kdrag0n.dev> | 2021-04-14 15:44:46 -0700 |
---|---|---|
committer | alk3pInjection <webmaster@raspii.tech> | 2021-09-27 21:17:05 +0800 |
commit | 50a425a8f1388e7b309764963ce6ff0f16f93c11 (patch) | |
tree | ccd297581efd89f63fa0a8b77477dbb0d3d7b12a | |
parent | 5478f53c7ca6c23972c4255226d62ab30e57bf34 (diff) |
[ProtonAOSP] blur: Calculate vertices in vertex shader instead of using VBO
Using a VBO for a simple full-screen triangle is unnecessarily
complicated, and because blur rendering is memory-bound, every little
bit of memory bandwidth counts. This removes the VBO in favor of
calculating the UV and clip space coordinates for a full-screen triangle
in the vertex shader, which only takes a few ALU instructions in a
shader that is only run 3 times per rendering step.
When tested with 2 layers of another 6-pass blur implementation, this
saves ~50 µs of rendering time on an Adreno 640 GPU at 1440x3040
resolution.
Change-Id: I6a3c6d691baa54412f4e04891129f101be6cdb60
-rw-r--r-- | libs/renderengine/gl/filters/BlurFilter.cpp | 59 | ||||
-rw-r--r-- | libs/renderengine/gl/filters/BlurFilter.h | 11 |
2 files changed, 13 insertions, 57 deletions
diff --git a/libs/renderengine/gl/filters/BlurFilter.cpp b/libs/renderengine/gl/filters/BlurFilter.cpp index d53fc8b25e..b139e4b3c5 100644 --- a/libs/renderengine/gl/filters/BlurFilter.cpp +++ b/libs/renderengine/gl/filters/BlurFilter.cpp @@ -41,15 +41,11 @@ BlurFilter::BlurFilter(GLESRenderEngine& engine) mDitherMixProgram(engine), mBlurProgram(engine) { mMixProgram.compile(getMixVertShader(), getMixFragShader()); - mMPosLoc = mMixProgram.getAttributeLocation("aPosition"); - mMUvLoc = mMixProgram.getAttributeLocation("aUV"); mMBlurTextureLoc = mMixProgram.getUniformLocation("uBlurTexture"); mMCompositionTextureLoc = mMixProgram.getUniformLocation("uCompositionTexture"); mMBlurOpacityLoc = mMixProgram.getUniformLocation("uBlurOpacity"); mDitherMixProgram.compile(getDitherMixVertShader(), getDitherMixFragShader()); - mDPosLoc = mDitherMixProgram.getAttributeLocation("aPosition"); - mDUvLoc = mDitherMixProgram.getAttributeLocation("aUV"); mDNoiseUvScaleLoc = mDitherMixProgram.getUniformLocation("uNoiseUVScale"); mDBlurTextureLoc = mDitherMixProgram.getUniformLocation("uBlurTexture"); mDDitherTextureLoc = mDitherMixProgram.getUniformLocation("uDitherTexture"); @@ -60,8 +56,6 @@ BlurFilter::BlurFilter(GLESRenderEngine& engine) GL_RGB8, GL_RGB, GL_UNSIGNED_BYTE); mBlurProgram.compile(getBlurVertShader(), getBlurFragShader()); - mBPosLoc = mBlurProgram.getAttributeLocation("aPosition"); - mBUvLoc = mBlurProgram.getAttributeLocation("aUV"); mBTextureLoc = mBlurProgram.getUniformLocation("uTexture"); mBOffsetLoc = mBlurProgram.getUniformLocation("uOffset"); @@ -76,20 +70,6 @@ BlurFilter::BlurFilter(GLESRenderEngine& engine) mBlurProgram.useProgram(); glUniform1i(mBTextureLoc, 0); glUseProgram(0); - - static constexpr auto size = 2.0f; - static constexpr auto translation = 1.0f; - const GLfloat vboData[] = { - // Vertex data - translation - size, -translation - size, - translation - size, -translation + size, - translation + size, -translation + size, - // UV data - 0.0f, 0.0f - translation, - 0.0f, size - translation, - size, size - translation - }; - mMeshBuffer.allocateBuffers(vboData, 12 /* size */); } status_t BlurFilter::setAsDrawTarget(const DisplaySettings& display, uint32_t radius) { @@ -146,17 +126,7 @@ status_t BlurFilter::setAsDrawTarget(const DisplaySettings& display, uint32_t ra return NO_ERROR; } -void BlurFilter::drawMesh(GLuint uv, GLuint position) { - - glEnableVertexAttribArray(uv); - glEnableVertexAttribArray(position); - mMeshBuffer.bind(); - glVertexAttribPointer(position, 2 /* size */, GL_FLOAT, GL_FALSE, - 2 * sizeof(GLfloat) /* stride */, 0 /* offset */); - glVertexAttribPointer(uv, 2 /* size */, GL_FLOAT, GL_FALSE, 0 /* stride */, - (GLvoid*)(6 * sizeof(GLfloat)) /* offset */); - mMeshBuffer.unbind(); - +void BlurFilter::drawMesh() { // draw mesh glDrawArrays(GL_TRIANGLES, 0 /* first */, 3 /* count */); } @@ -199,7 +169,7 @@ status_t BlurFilter::prepare() { glBindTexture(GL_TEXTURE_2D, read->getTextureName()); glUniform2f(mBOffsetLoc, stepX * i, stepY * i); - drawMesh(mBUvLoc, mBPosLoc); + drawMesh(); // Swap buffers for next iteration std::swap(read, draw); @@ -234,11 +204,11 @@ status_t BlurFilter::render(size_t layers, int currentLayer) { if (currentLayer == layers - 1) { mDitherMixProgram.useProgram(); glUniform1f(mDBlurOpacityLoc, opacity); - drawMesh(mDUvLoc, mDPosLoc); + drawMesh(); } else { mMixProgram.useProgram(); glUniform1f(mMBlurOpacityLoc, opacity); - drawMesh(mMUvLoc, mMPosLoc); + drawMesh(); } glUseProgram(0); @@ -253,14 +223,12 @@ string BlurFilter::getBlurVertShader() const { uniform vec2 uOffset; - in vec2 aPosition; - in vec2 aUV; out vec2 vUV; out vec2 vBlurTaps[4]; void main() { - vUV = aUV; - gl_Position = vec4(aPosition, 0.0, 1.0); + vUV = vec2((gl_VertexID == 2) ? 2.0 : 0.0, (gl_VertexID == 1) ? 2.0 : 0.0); + gl_Position = vec4(vUV * 2.0 - 1.0, 1.0, 1.0); vBlurTaps[0] = vUV + vec2( uOffset.x, uOffset.y); vBlurTaps[1] = vUV + vec2( uOffset.x, -uOffset.y); @@ -296,13 +264,11 @@ string BlurFilter::getMixVertShader() const { return R"SHADER(#version 310 es precision mediump float; - in vec2 aPosition; - in vec2 aUV; out vec2 vUV; void main() { - vUV = aUV; - gl_Position = vec4(aPosition, 0.0, 1.0); + vUV = vec2((gl_VertexID == 2) ? 2.0 : 0.0, (gl_VertexID == 1) ? 2.0 : 0.0); + gl_Position = vec4(vUV * 2.0 - 1.0, 1.0, 1.0); } )SHADER"; } @@ -333,15 +299,14 @@ string BlurFilter::getDitherMixVertShader() const { uniform vec2 uNoiseUVScale; - in vec2 aPosition; - in vec2 aUV; out vec2 vUV; out vec2 vNoiseUV; void main() { - vUV = aUV; - vNoiseUV = aUV * uNoiseUVScale; - gl_Position = vec4(aPosition, 0.0, 1.0); + vUV = vec2((gl_VertexID == 2) ? 2.0 : 0.0, (gl_VertexID == 1) ? 2.0 : 0.0); + gl_Position = vec4(vUV * 2.0 - 1.0, 1.0, 1.0); + + vNoiseUV = vUV * uNoiseUVScale; } )SHADER"; } diff --git a/libs/renderengine/gl/filters/BlurFilter.h b/libs/renderengine/gl/filters/BlurFilter.h index e5dae7b9ea..df2ca1deca 100644 --- a/libs/renderengine/gl/filters/BlurFilter.h +++ b/libs/renderengine/gl/filters/BlurFilter.h @@ -53,7 +53,7 @@ public: private: uint32_t mRadius; - void drawMesh(GLuint uv, GLuint position); + void drawMesh(); string getBlurVertShader() const; string getBlurFragShader() const; string getMixVertShader() const; @@ -76,19 +76,12 @@ private: // Buffer holding the final blur pass. GLFramebuffer* mLastDrawTarget; - // VBO containing vertex and uv data of a fullscreen triangle. - GLVertexBuffer mMeshBuffer; - GenericProgram mMixProgram; - GLuint mMPosLoc; - GLuint mMUvLoc; GLuint mMBlurOpacityLoc; GLuint mMBlurTextureLoc; GLuint mMCompositionTextureLoc; GenericProgram mDitherMixProgram; - GLuint mDPosLoc; - GLuint mDUvLoc; GLuint mDNoiseUvScaleLoc; GLuint mDBlurOpacityLoc; GLuint mDBlurTextureLoc; @@ -96,8 +89,6 @@ private: GLuint mDCompositionTextureLoc; GenericProgram mBlurProgram; - GLuint mBPosLoc; - GLuint mBUvLoc; GLuint mBTextureLoc; GLuint mBOffsetLoc; }; |