summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDanny Lin <danny@kdrag0n.dev>2021-04-14 15:44:46 -0700
committeralk3pInjection <webmaster@raspii.tech>2021-09-27 21:17:05 +0800
commit50a425a8f1388e7b309764963ce6ff0f16f93c11 (patch)
treeccd297581efd89f63fa0a8b77477dbb0d3d7b12a
parent5478f53c7ca6c23972c4255226d62ab30e57bf34 (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.cpp59
-rw-r--r--libs/renderengine/gl/filters/BlurFilter.h11
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;
};