Re: [Mesa-dev] [PATCH v6] swr: implement clipPlanes/clipVertex/clipDistance/cullDistance
Reviewed-by: Bruce Cherniak> On Jun 8, 2016, at 9:59 AM, Tim Rowley wrote: > > v2: only load the clip vertex once > > v3: fix clip enable logic, add cullDistance > > v4: remove duplicate fields in vs jit key, fix test of clip fixup needed > > v5: fix clipdistance linkage for slot!=0,4 > > v6: support clip+cull; passes most piglit clip (failures understood) > --- > docs/GL3.txt | 2 +- > src/gallium/drivers/swr/swr_context.h | 2 ++ > src/gallium/drivers/swr/swr_screen.cpp | 3 +- > src/gallium/drivers/swr/swr_shader.cpp | 65 ++ > src/gallium/drivers/swr/swr_shader.h | 1 + > src/gallium/drivers/swr/swr_state.cpp | 25 - > 6 files changed, 95 insertions(+), 3 deletions(-) > > diff --git a/docs/GL3.txt b/docs/GL3.txt > index e8d401d..4ba0366 100644 > --- a/docs/GL3.txt > +++ b/docs/GL3.txt > @@ -211,7 +211,7 @@ GL 4.5, GLSL 4.50: > GL_ARB_ES3_1_compatibilityDONE (nvc0, radeonsi) > GL_ARB_clip_control DONE (i965, nv50, > nvc0, r600, radeonsi, llvmpipe, softpipe, swr) > GL_ARB_conditional_render_invertedDONE (i965, nv50, > nvc0, r600, radeonsi, llvmpipe, softpipe, swr) > - GL_ARB_cull_distance DONE (i965, nv50, > nvc0, llvmpipe, softpipe) > + GL_ARB_cull_distance DONE (i965, nv50, > nvc0, llvmpipe, softpipe, swr) > GL_ARB_derivative_control DONE (i965, nv50, > nvc0, r600, radeonsi) > GL_ARB_direct_state_accessDONE (all drivers) > GL_ARB_get_texture_sub_image DONE (all drivers) > diff --git a/src/gallium/drivers/swr/swr_context.h > b/src/gallium/drivers/swr/swr_context.h > index a7383bb..75ecae3 100644 > --- a/src/gallium/drivers/swr/swr_context.h > +++ b/src/gallium/drivers/swr/swr_context.h > @@ -89,6 +89,8 @@ struct swr_draw_context { >swr_jit_texture texturesFS[PIPE_MAX_SHADER_SAMPLER_VIEWS]; >swr_jit_sampler samplersFS[PIPE_MAX_SAMPLERS]; > > + float userClipPlanes[PIPE_MAX_CLIP_PLANES][4]; > + >SWR_SURFACE_STATE renderTargets[SWR_NUM_ATTACHMENTS]; > }; > > diff --git a/src/gallium/drivers/swr/swr_screen.cpp > b/src/gallium/drivers/swr/swr_screen.cpp > index ca39202..af82c93 100644 > --- a/src/gallium/drivers/swr/swr_screen.cpp > +++ b/src/gallium/drivers/swr/swr_screen.cpp > @@ -333,6 +333,8 @@ swr_get_param(struct pipe_screen *screen, enum pipe_cap > param) >case PIPE_CAP_TEXTURE_FLOAT_LINEAR: >case PIPE_CAP_TEXTURE_HALF_FLOAT_LINEAR: > return 1; > + case PIPE_CAP_CULL_DISTANCE: > + return 1; >case PIPE_CAP_TGSI_TXQS: >case PIPE_CAP_FORCE_PERSAMPLE_INTERP: >case PIPE_CAP_SHAREABLE_SHADERS: > @@ -358,7 +360,6 @@ swr_get_param(struct pipe_screen *screen, enum pipe_cap > param) >case PIPE_CAP_PCI_DEVICE: >case PIPE_CAP_PCI_FUNCTION: >case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT: > - case PIPE_CAP_CULL_DISTANCE: >case PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES: >case PIPE_CAP_TGSI_VOTE: > return 0; > diff --git a/src/gallium/drivers/swr/swr_shader.cpp > b/src/gallium/drivers/swr/swr_shader.cpp > index f26467e..8af0700 100644 > --- a/src/gallium/drivers/swr/swr_shader.cpp > +++ b/src/gallium/drivers/swr/swr_shader.cpp > @@ -40,6 +40,9 @@ > #include "swr_state.h" > #include "swr_screen.h" > > +static unsigned > +locate_linkage(ubyte name, ubyte index, struct tgsi_shader_info *info); > + > bool operator==(const swr_jit_fs_key , const swr_jit_fs_key ) > { >return !memcmp(, , sizeof(lhs)); > @@ -119,6 +122,11 @@ swr_generate_vs_key(struct swr_jit_vs_key , > { >memset(, 0, sizeof(key)); > > + key.clip_plane_mask = > + swr_vs->info.base.clipdist_writemask ? > + swr_vs->info.base.clipdist_writemask & > ctx->rasterizer->clip_plane_enable : > + ctx->rasterizer->clip_plane_enable; > + >swr_generate_sampler_key(swr_vs->info, ctx, PIPE_SHADER_VERTEX, key); > } > > @@ -251,6 +259,63 @@ BuilderSWR::CompileVS(struct swr_context *ctx, > swr_jit_vs_key ) > } >} > > + if (ctx->rasterizer->clip_plane_enable || > + swr_vs->info.base.culldist_writemask) { > + unsigned clip_mask = ctx->rasterizer->clip_plane_enable; > + > + unsigned cv = 0; > + if (swr_vs->info.base.writes_clipvertex) { > + cv = 1 + locate_linkage(TGSI_SEMANTIC_CLIPVERTEX, 0, > + _vs->info.base); > + } else { > + for (int i = 0; i < PIPE_MAX_SHADER_OUTPUTS; i++) { > +if (swr_vs->info.base.output_semantic_name[i] == > TGSI_SEMANTIC_POSITION && > +swr_vs->info.base.output_semantic_index[i] == 0) { > + cv = i; > + break; > +} > + } > + } > + LLVMValueRef cx = LLVMBuildLoad(gallivm->builder, outputs[cv][0], "");
[Mesa-dev] [PATCH v6] swr: implement clipPlanes/clipVertex/clipDistance/cullDistance
v2: only load the clip vertex once v3: fix clip enable logic, add cullDistance v4: remove duplicate fields in vs jit key, fix test of clip fixup needed v5: fix clipdistance linkage for slot!=0,4 v6: support clip+cull; passes most piglit clip (failures understood) --- docs/GL3.txt | 2 +- src/gallium/drivers/swr/swr_context.h | 2 ++ src/gallium/drivers/swr/swr_screen.cpp | 3 +- src/gallium/drivers/swr/swr_shader.cpp | 65 ++ src/gallium/drivers/swr/swr_shader.h | 1 + src/gallium/drivers/swr/swr_state.cpp | 25 - 6 files changed, 95 insertions(+), 3 deletions(-) diff --git a/docs/GL3.txt b/docs/GL3.txt index e8d401d..4ba0366 100644 --- a/docs/GL3.txt +++ b/docs/GL3.txt @@ -211,7 +211,7 @@ GL 4.5, GLSL 4.50: GL_ARB_ES3_1_compatibilityDONE (nvc0, radeonsi) GL_ARB_clip_control DONE (i965, nv50, nvc0, r600, radeonsi, llvmpipe, softpipe, swr) GL_ARB_conditional_render_invertedDONE (i965, nv50, nvc0, r600, radeonsi, llvmpipe, softpipe, swr) - GL_ARB_cull_distance DONE (i965, nv50, nvc0, llvmpipe, softpipe) + GL_ARB_cull_distance DONE (i965, nv50, nvc0, llvmpipe, softpipe, swr) GL_ARB_derivative_control DONE (i965, nv50, nvc0, r600, radeonsi) GL_ARB_direct_state_accessDONE (all drivers) GL_ARB_get_texture_sub_image DONE (all drivers) diff --git a/src/gallium/drivers/swr/swr_context.h b/src/gallium/drivers/swr/swr_context.h index a7383bb..75ecae3 100644 --- a/src/gallium/drivers/swr/swr_context.h +++ b/src/gallium/drivers/swr/swr_context.h @@ -89,6 +89,8 @@ struct swr_draw_context { swr_jit_texture texturesFS[PIPE_MAX_SHADER_SAMPLER_VIEWS]; swr_jit_sampler samplersFS[PIPE_MAX_SAMPLERS]; + float userClipPlanes[PIPE_MAX_CLIP_PLANES][4]; + SWR_SURFACE_STATE renderTargets[SWR_NUM_ATTACHMENTS]; }; diff --git a/src/gallium/drivers/swr/swr_screen.cpp b/src/gallium/drivers/swr/swr_screen.cpp index ca39202..af82c93 100644 --- a/src/gallium/drivers/swr/swr_screen.cpp +++ b/src/gallium/drivers/swr/swr_screen.cpp @@ -333,6 +333,8 @@ swr_get_param(struct pipe_screen *screen, enum pipe_cap param) case PIPE_CAP_TEXTURE_FLOAT_LINEAR: case PIPE_CAP_TEXTURE_HALF_FLOAT_LINEAR: return 1; + case PIPE_CAP_CULL_DISTANCE: + return 1; case PIPE_CAP_TGSI_TXQS: case PIPE_CAP_FORCE_PERSAMPLE_INTERP: case PIPE_CAP_SHAREABLE_SHADERS: @@ -358,7 +360,6 @@ swr_get_param(struct pipe_screen *screen, enum pipe_cap param) case PIPE_CAP_PCI_DEVICE: case PIPE_CAP_PCI_FUNCTION: case PIPE_CAP_FRAMEBUFFER_NO_ATTACHMENT: - case PIPE_CAP_CULL_DISTANCE: case PIPE_CAP_PRIMITIVE_RESTART_FOR_PATCHES: case PIPE_CAP_TGSI_VOTE: return 0; diff --git a/src/gallium/drivers/swr/swr_shader.cpp b/src/gallium/drivers/swr/swr_shader.cpp index f26467e..8af0700 100644 --- a/src/gallium/drivers/swr/swr_shader.cpp +++ b/src/gallium/drivers/swr/swr_shader.cpp @@ -40,6 +40,9 @@ #include "swr_state.h" #include "swr_screen.h" +static unsigned +locate_linkage(ubyte name, ubyte index, struct tgsi_shader_info *info); + bool operator==(const swr_jit_fs_key , const swr_jit_fs_key ) { return !memcmp(, , sizeof(lhs)); @@ -119,6 +122,11 @@ swr_generate_vs_key(struct swr_jit_vs_key , { memset(, 0, sizeof(key)); + key.clip_plane_mask = + swr_vs->info.base.clipdist_writemask ? + swr_vs->info.base.clipdist_writemask & ctx->rasterizer->clip_plane_enable : + ctx->rasterizer->clip_plane_enable; + swr_generate_sampler_key(swr_vs->info, ctx, PIPE_SHADER_VERTEX, key); } @@ -251,6 +259,63 @@ BuilderSWR::CompileVS(struct swr_context *ctx, swr_jit_vs_key ) } } + if (ctx->rasterizer->clip_plane_enable || + swr_vs->info.base.culldist_writemask) { + unsigned clip_mask = ctx->rasterizer->clip_plane_enable; + + unsigned cv = 0; + if (swr_vs->info.base.writes_clipvertex) { + cv = 1 + locate_linkage(TGSI_SEMANTIC_CLIPVERTEX, 0, + _vs->info.base); + } else { + for (int i = 0; i < PIPE_MAX_SHADER_OUTPUTS; i++) { +if (swr_vs->info.base.output_semantic_name[i] == TGSI_SEMANTIC_POSITION && +swr_vs->info.base.output_semantic_index[i] == 0) { + cv = i; + break; +} + } + } + LLVMValueRef cx = LLVMBuildLoad(gallivm->builder, outputs[cv][0], ""); + LLVMValueRef cy = LLVMBuildLoad(gallivm->builder, outputs[cv][1], ""); + LLVMValueRef cz = LLVMBuildLoad(gallivm->builder, outputs[cv][2], ""); + LLVMValueRef cw = LLVMBuildLoad(gallivm->builder, outputs[cv][3], ""); + + for (unsigned val = 0; val < PIPE_MAX_CLIP_PLANES; val++) { + // clip distance overrides