Re: [Mesa-dev] [PATCH] meta: Use AMD_vertex_shader_layer instead of a GS for layered clears.
On Monday, June 23, 2014 09:11:09 PM Chris Forbes wrote: Reviewed-by: Chris Forbes chr...@ijw.co.nz Have you got a case where this makes a noticeable difference to performance? No, not particularly - I was just looking at INTEL_DEBUG=state when running Shadowrun and noticed a bunch of GS and URB churn in an application that purely uses ARB programs. Seemed strange. With the patch, GS remained untouched. A couple quick tests doesn't show much gain from the change. But it does simplify the code a bit, at least. --Ken signature.asc Description: This is a digitally signed message part. ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev
Re: [Mesa-dev] [PATCH] meta: Use AMD_vertex_shader_layer instead of a GS for layered clears.
Reviewed-by: Chris Forbes chr...@ijw.co.nz Have you got a case where this makes a noticeable difference to performance? On Mon, Jun 23, 2014 at 5:27 PM, Kenneth Graunke kenn...@whitecape.org wrote: On i965, enabling and disabling the GS is not free: you have to do a full pipeline stall, reconfigure the URB and push constant space, and emit a bunch of state. Most clears aren't layered, so the GS isn't needed in the common case. But we turned it on anyway. As far as I know, most GPUs that support layered rendering can support the GL_AMD_vertex_shader_layer extension. i965 does, and it's also the only driver using this path that does layered rendering. Doing so allows us to skip setting up the GS. Signed-off-by: Kenneth Graunke kenn...@whitecape.org --- src/mesa/drivers/common/meta.c | 53 +- 1 file changed, 16 insertions(+), 37 deletions(-) diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c index cab0dd8..a4634a3 100644 --- a/src/mesa/drivers/common/meta.c +++ b/src/mesa/drivers/common/meta.c @@ -1515,23 +1515,15 @@ static void meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear) { const char *vs_source = + #extension GL_AMD_vertex_shader_layer : enable\n attribute vec4 position;\n - void main()\n - {\n - gl_Position = position;\n - }\n; - const char *gs_source = - #version 150\n - layout(triangles) in;\n - layout(triangle_strip, max_vertices = 4) out;\n uniform int layer;\n void main()\n {\n -for (int i = 0; i 3; i++) {\n - gl_Layer = layer;\n - gl_Position = gl_in[i].gl_Position;\n - EmitVertex();\n -}\n + #ifdef GL_AMD_vertex_shader_layer\n + gl_Layer = layer;\n + #endif\n + gl_Position = position;\n }\n; const char *fs_source = uniform vec4 color;\n @@ -1539,7 +1531,7 @@ meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear) {\n gl_FragColor = color;\n }\n; - GLuint vs, gs = 0, fs; + GLuint vs, fs; bool has_integer_textures; _mesa_meta_setup_vertex_objects(clear-VAO, clear-VBO, true, 3, 0, 0); @@ -1551,12 +1543,6 @@ meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear) _mesa_ShaderSource(vs, 1, vs_source, NULL); _mesa_CompileShader(vs); - if (_mesa_has_geometry_shaders(ctx)) { - gs = _mesa_CreateShader(GL_GEOMETRY_SHADER); - _mesa_ShaderSource(gs, 1, gs_source, NULL); - _mesa_CompileShader(gs); - } - fs = _mesa_CreateShader(GL_FRAGMENT_SHADER); _mesa_ShaderSource(fs, 1, fs_source, NULL); _mesa_CompileShader(fs); @@ -1564,20 +1550,14 @@ meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear) clear-ShaderProg = _mesa_CreateProgram(); _mesa_AttachShader(clear-ShaderProg, fs); _mesa_DeleteShader(fs); - if (gs != 0) - _mesa_AttachShader(clear-ShaderProg, gs); _mesa_AttachShader(clear-ShaderProg, vs); _mesa_DeleteShader(vs); _mesa_BindAttribLocation(clear-ShaderProg, 0, position); _mesa_ObjectLabel(GL_PROGRAM, clear-ShaderProg, -1, meta clear); _mesa_LinkProgram(clear-ShaderProg); - clear-ColorLocation = _mesa_GetUniformLocation(clear-ShaderProg, - color); - if (gs != 0) { - clear-LayerLocation = _mesa_GetUniformLocation(clear-ShaderProg, - layer); - } + clear-ColorLocation = _mesa_GetUniformLocation(clear-ShaderProg, color); + clear-LayerLocation = _mesa_GetUniformLocation(clear-ShaderProg, layer); has_integer_textures = _mesa_is_gles3(ctx) || (_mesa_is_desktop_gl(ctx) ctx-Const.GLSLVersion = 130); @@ -1587,9 +1567,14 @@ meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear) const char *vs_int_source = ralloc_asprintf(shader_source_mem_ctx, #version 130\n + #extension GL_AMD_vertex_shader_layer : enable\n in vec4 position;\n + uniform int layer;\n void main()\n {\n + #ifdef GL_AMD_vertex_shader_layer\n +gl_Layer = layer;\n + #endif\n gl_Position = position;\n }\n); const char *fs_int_source = @@ -1612,8 +1597,6 @@ meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear) clear-IntegerShaderProg = _mesa_CreateProgram(); _mesa_AttachShader(clear-IntegerShaderProg, fs); _mesa_DeleteShader(fs); - if (gs != 0) - _mesa_AttachShader(clear-IntegerShaderProg, gs);
Re: [Mesa-dev] [PATCH] meta: Use AMD_vertex_shader_layer instead of a GS for layered clears.
On Mon, Jun 23, 2014 at 1:27 AM, Kenneth Graunke kenn...@whitecape.org wrote: On i965, enabling and disabling the GS is not free: you have to do a full pipeline stall, reconfigure the URB and push constant space, and emit a bunch of state. Most clears aren't layered, so the GS isn't needed in the common case. But we turned it on anyway. As far as I know, most GPUs that support layered rendering can support the GL_AMD_vertex_shader_layer extension. i965 does, and it's also the Not that this matters for meta, but FTR, NVIDIA GPU's don't support AMD_vertex_shader_layer. only driver using this path that does layered rendering. Doing so allows us to skip setting up the GS. Signed-off-by: Kenneth Graunke kenn...@whitecape.org --- src/mesa/drivers/common/meta.c | 53 +- 1 file changed, 16 insertions(+), 37 deletions(-) diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c index cab0dd8..a4634a3 100644 --- a/src/mesa/drivers/common/meta.c +++ b/src/mesa/drivers/common/meta.c @@ -1515,23 +1515,15 @@ static void meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear) { const char *vs_source = + #extension GL_AMD_vertex_shader_layer : enable\n attribute vec4 position;\n - void main()\n - {\n - gl_Position = position;\n - }\n; - const char *gs_source = - #version 150\n - layout(triangles) in;\n - layout(triangle_strip, max_vertices = 4) out;\n uniform int layer;\n void main()\n {\n -for (int i = 0; i 3; i++) {\n - gl_Layer = layer;\n - gl_Position = gl_in[i].gl_Position;\n - EmitVertex();\n -}\n + #ifdef GL_AMD_vertex_shader_layer\n + gl_Layer = layer;\n + #endif\n + gl_Position = position;\n }\n; const char *fs_source = uniform vec4 color;\n @@ -1539,7 +1531,7 @@ meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear) {\n gl_FragColor = color;\n }\n; - GLuint vs, gs = 0, fs; + GLuint vs, fs; bool has_integer_textures; _mesa_meta_setup_vertex_objects(clear-VAO, clear-VBO, true, 3, 0, 0); @@ -1551,12 +1543,6 @@ meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear) _mesa_ShaderSource(vs, 1, vs_source, NULL); _mesa_CompileShader(vs); - if (_mesa_has_geometry_shaders(ctx)) { - gs = _mesa_CreateShader(GL_GEOMETRY_SHADER); - _mesa_ShaderSource(gs, 1, gs_source, NULL); - _mesa_CompileShader(gs); - } - fs = _mesa_CreateShader(GL_FRAGMENT_SHADER); _mesa_ShaderSource(fs, 1, fs_source, NULL); _mesa_CompileShader(fs); @@ -1564,20 +1550,14 @@ meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear) clear-ShaderProg = _mesa_CreateProgram(); _mesa_AttachShader(clear-ShaderProg, fs); _mesa_DeleteShader(fs); - if (gs != 0) - _mesa_AttachShader(clear-ShaderProg, gs); _mesa_AttachShader(clear-ShaderProg, vs); _mesa_DeleteShader(vs); _mesa_BindAttribLocation(clear-ShaderProg, 0, position); _mesa_ObjectLabel(GL_PROGRAM, clear-ShaderProg, -1, meta clear); _mesa_LinkProgram(clear-ShaderProg); - clear-ColorLocation = _mesa_GetUniformLocation(clear-ShaderProg, - color); - if (gs != 0) { - clear-LayerLocation = _mesa_GetUniformLocation(clear-ShaderProg, - layer); - } + clear-ColorLocation = _mesa_GetUniformLocation(clear-ShaderProg, color); + clear-LayerLocation = _mesa_GetUniformLocation(clear-ShaderProg, layer); has_integer_textures = _mesa_is_gles3(ctx) || (_mesa_is_desktop_gl(ctx) ctx-Const.GLSLVersion = 130); @@ -1587,9 +1567,14 @@ meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear) const char *vs_int_source = ralloc_asprintf(shader_source_mem_ctx, #version 130\n + #extension GL_AMD_vertex_shader_layer : enable\n in vec4 position;\n + uniform int layer;\n void main()\n {\n + #ifdef GL_AMD_vertex_shader_layer\n +gl_Layer = layer;\n + #endif\n gl_Position = position;\n }\n); const char *fs_int_source = @@ -1612,8 +1597,6 @@ meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear) clear-IntegerShaderProg = _mesa_CreateProgram(); _mesa_AttachShader(clear-IntegerShaderProg, fs); _mesa_DeleteShader(fs); - if (gs != 0) - _mesa_AttachShader(clear-IntegerShaderProg, gs);
[Mesa-dev] [PATCH] meta: Use AMD_vertex_shader_layer instead of a GS for layered clears.
On i965, enabling and disabling the GS is not free: you have to do a full pipeline stall, reconfigure the URB and push constant space, and emit a bunch of state. Most clears aren't layered, so the GS isn't needed in the common case. But we turned it on anyway. As far as I know, most GPUs that support layered rendering can support the GL_AMD_vertex_shader_layer extension. i965 does, and it's also the only driver using this path that does layered rendering. Doing so allows us to skip setting up the GS. Signed-off-by: Kenneth Graunke kenn...@whitecape.org --- src/mesa/drivers/common/meta.c | 53 +- 1 file changed, 16 insertions(+), 37 deletions(-) diff --git a/src/mesa/drivers/common/meta.c b/src/mesa/drivers/common/meta.c index cab0dd8..a4634a3 100644 --- a/src/mesa/drivers/common/meta.c +++ b/src/mesa/drivers/common/meta.c @@ -1515,23 +1515,15 @@ static void meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear) { const char *vs_source = + #extension GL_AMD_vertex_shader_layer : enable\n attribute vec4 position;\n - void main()\n - {\n - gl_Position = position;\n - }\n; - const char *gs_source = - #version 150\n - layout(triangles) in;\n - layout(triangle_strip, max_vertices = 4) out;\n uniform int layer;\n void main()\n {\n -for (int i = 0; i 3; i++) {\n - gl_Layer = layer;\n - gl_Position = gl_in[i].gl_Position;\n - EmitVertex();\n -}\n + #ifdef GL_AMD_vertex_shader_layer\n + gl_Layer = layer;\n + #endif\n + gl_Position = position;\n }\n; const char *fs_source = uniform vec4 color;\n @@ -1539,7 +1531,7 @@ meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear) {\n gl_FragColor = color;\n }\n; - GLuint vs, gs = 0, fs; + GLuint vs, fs; bool has_integer_textures; _mesa_meta_setup_vertex_objects(clear-VAO, clear-VBO, true, 3, 0, 0); @@ -1551,12 +1543,6 @@ meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear) _mesa_ShaderSource(vs, 1, vs_source, NULL); _mesa_CompileShader(vs); - if (_mesa_has_geometry_shaders(ctx)) { - gs = _mesa_CreateShader(GL_GEOMETRY_SHADER); - _mesa_ShaderSource(gs, 1, gs_source, NULL); - _mesa_CompileShader(gs); - } - fs = _mesa_CreateShader(GL_FRAGMENT_SHADER); _mesa_ShaderSource(fs, 1, fs_source, NULL); _mesa_CompileShader(fs); @@ -1564,20 +1550,14 @@ meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear) clear-ShaderProg = _mesa_CreateProgram(); _mesa_AttachShader(clear-ShaderProg, fs); _mesa_DeleteShader(fs); - if (gs != 0) - _mesa_AttachShader(clear-ShaderProg, gs); _mesa_AttachShader(clear-ShaderProg, vs); _mesa_DeleteShader(vs); _mesa_BindAttribLocation(clear-ShaderProg, 0, position); _mesa_ObjectLabel(GL_PROGRAM, clear-ShaderProg, -1, meta clear); _mesa_LinkProgram(clear-ShaderProg); - clear-ColorLocation = _mesa_GetUniformLocation(clear-ShaderProg, - color); - if (gs != 0) { - clear-LayerLocation = _mesa_GetUniformLocation(clear-ShaderProg, - layer); - } + clear-ColorLocation = _mesa_GetUniformLocation(clear-ShaderProg, color); + clear-LayerLocation = _mesa_GetUniformLocation(clear-ShaderProg, layer); has_integer_textures = _mesa_is_gles3(ctx) || (_mesa_is_desktop_gl(ctx) ctx-Const.GLSLVersion = 130); @@ -1587,9 +1567,14 @@ meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear) const char *vs_int_source = ralloc_asprintf(shader_source_mem_ctx, #version 130\n + #extension GL_AMD_vertex_shader_layer : enable\n in vec4 position;\n + uniform int layer;\n void main()\n {\n + #ifdef GL_AMD_vertex_shader_layer\n +gl_Layer = layer;\n + #endif\n gl_Position = position;\n }\n); const char *fs_int_source = @@ -1612,8 +1597,6 @@ meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear) clear-IntegerShaderProg = _mesa_CreateProgram(); _mesa_AttachShader(clear-IntegerShaderProg, fs); _mesa_DeleteShader(fs); - if (gs != 0) - _mesa_AttachShader(clear-IntegerShaderProg, gs); _mesa_AttachShader(clear-IntegerShaderProg, vs); _mesa_DeleteShader(vs); _mesa_BindAttribLocation(clear-IntegerShaderProg, 0, position); @@ -1629,13 +1612,9 @@ meta_glsl_clear_init(struct gl_context *ctx, struct clear_state *clear) clear-IntegerColorLocation =