Am 06.12.2014 um 18:24 schrieb Marek Olšák:
> Ping.
> 
> On Mon, Nov 17, 2014 at 10:43 PM, Marek Olšák <mar...@gmail.com> wrote:
>> From: Marek Olšák <marek.ol...@amd.com>
>>
>> Required by Nine. Tested with util_run_tests.
>> It's added to softpipe, llvmpipe, and r300g/swtcl.
>> ---
>>  src/gallium/auxiliary/draw/draw_context.c          | 40 
>> ++++++++++++++++++----
>>  src/gallium/auxiliary/draw/draw_llvm.c             |  2 +-
>>  src/gallium/auxiliary/draw/draw_private.h          |  4 +++
>>  .../auxiliary/draw/draw_pt_fetch_shade_emit.c      |  2 +-
>>  .../auxiliary/draw/draw_pt_fetch_shade_pipeline.c  |  2 +-
>>  .../draw/draw_pt_fetch_shade_pipeline_llvm.c       |  2 +-
>>  src/gallium/auxiliary/draw/draw_vs.c               |  2 ++
>>  src/gallium/drivers/llvmpipe/lp_screen.c           |  2 ++
>>  src/gallium/drivers/r300/r300_screen.c             |  2 +-
>>  src/gallium/drivers/softpipe/sp_screen.c           |  2 ++
>>  10 files changed, 49 insertions(+), 11 deletions(-)
>>
>> diff --git a/src/gallium/auxiliary/draw/draw_context.c 
>> b/src/gallium/auxiliary/draw/draw_context.c
>> index 2b640b6..d473cfc 100644
>> --- a/src/gallium/auxiliary/draw/draw_context.c
>> +++ b/src/gallium/auxiliary/draw/draw_context.c
>> @@ -267,21 +267,48 @@ void draw_set_zs_format(struct draw_context *draw, 
>> enum pipe_format format)
>>  }
>>
>>
>> -static void update_clip_flags( struct draw_context *draw )
>> +static bool
>> +draw_is_vs_window_space(struct draw_context *draw)
>>  {
>> -   draw->clip_xy = !draw->driver.bypass_clip_xy;
>> +   if (draw->vs.vertex_shader) {
>> +      struct tgsi_shader_info *info = &draw->vs.vertex_shader->info;
>> +
>> +      return info->properties[TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION] != 0;
>> +   }
>> +   return false;
>> +}
>> +
>> +
>> +void
>> +draw_update_clip_flags(struct draw_context *draw)
>> +{
>> +   bool window_space = draw_is_vs_window_space(draw);
>> +
>> +   draw->clip_xy = !draw->driver.bypass_clip_xy && !window_space;
>>     draw->guard_band_xy = (!draw->driver.bypass_clip_xy &&
>>                            draw->driver.guard_band_xy);
>>     draw->clip_z = (!draw->driver.bypass_clip_z &&
>> -                   draw->rasterizer && draw->rasterizer->depth_clip);
>> +                   draw->rasterizer && draw->rasterizer->depth_clip) &&
>> +                  !window_space;
>>     draw->clip_user = draw->rasterizer &&
>> -                     draw->rasterizer->clip_plane_enable != 0;
>> +                     draw->rasterizer->clip_plane_enable != 0 &&
>> +                     !window_space;
>>     draw->guard_band_points_xy = draw->guard_band_xy ||
>>                                  (draw->driver.bypass_clip_points &&
>>                                  (draw->rasterizer &&
>>                                   draw->rasterizer->point_tri_clip));
>>  }
>>
>> +
>> +void
>> +draw_update_viewport_flags(struct draw_context *draw)
>> +{
>> +   bool window_space = draw_is_vs_window_space(draw);
>> +
>> +   draw->bypass_viewport = window_space || draw->identity_viewport;
>> +}
>> +
>> +
>>  /**
>>   * Register new primitive rasterization/rendering state.
>>   * This causes the drawing pipeline to be rebuilt.
>> @@ -295,7 +322,7 @@ void draw_set_rasterizer_state( struct draw_context 
>> *draw,
>>
>>        draw->rasterizer = raster;
>>        draw->rast_handle = rast_handle;
>> -      update_clip_flags(draw);
>> +      draw_update_clip_flags(draw);
>>     }
>>  }
>>
>> @@ -322,7 +349,7 @@ void draw_set_driver_clipping( struct draw_context *draw,
>>     draw->driver.bypass_clip_z = bypass_clip_z;
>>     draw->driver.guard_band_xy = guard_band_xy;
>>     draw->driver.bypass_clip_points = bypass_clip_points;
>> -   update_clip_flags(draw);
>> +   draw_update_clip_flags(draw);
>>  }
>>
>>
>> @@ -376,6 +403,7 @@ void draw_set_viewport_states( struct draw_context *draw,
>>         viewport->translate[0] == 0.0f &&
>>         viewport->translate[1] == 0.0f &&
>>         viewport->translate[2] == 0.0f);
>> +   draw_update_viewport_flags(draw);
>>  }
>>
>>
>> diff --git a/src/gallium/auxiliary/draw/draw_llvm.c 
>> b/src/gallium/auxiliary/draw/draw_llvm.c
>> index 3a1b057..fbbe08b 100644
>> --- a/src/gallium/auxiliary/draw/draw_llvm.c
>> +++ b/src/gallium/auxiliary/draw/draw_llvm.c
>> @@ -1831,7 +1831,7 @@ draw_llvm_make_variant_key(struct draw_llvm *llvm, 
>> char *store)
>>     key->clip_xy = llvm->draw->clip_xy;
>>     key->clip_z = llvm->draw->clip_z;
>>     key->clip_user = llvm->draw->clip_user;
>> -   key->bypass_viewport = llvm->draw->identity_viewport;
>> +   key->bypass_viewport = llvm->draw->bypass_viewport;
>>     key->clip_halfz = llvm->draw->rasterizer->clip_halfz;
>>     key->need_edgeflags = (llvm->draw->vs.edgeflag_output ? TRUE : FALSE);
>>     key->ucp_enable = llvm->draw->rasterizer->clip_plane_enable;
>> diff --git a/src/gallium/auxiliary/draw/draw_private.h 
>> b/src/gallium/auxiliary/draw/draw_private.h
>> index d8dc2ab..8d4e1cd 100644
>> --- a/src/gallium/auxiliary/draw/draw_private.h
>> +++ b/src/gallium/auxiliary/draw/draw_private.h
>> @@ -252,6 +252,7 @@ struct draw_context
>>
>>     struct pipe_viewport_state viewports[PIPE_MAX_VIEWPORTS];
>>     boolean identity_viewport;
>> +   boolean bypass_viewport;
>>
>>     /** Vertex shader state */
>>     struct {
>> @@ -478,6 +479,9 @@ void
>>  draw_stats_clipper_primitives(struct draw_context *draw,
>>                                const struct draw_prim_info *prim_info);
>>
>> +void draw_update_clip_flags(struct draw_context *draw);
>> +void draw_update_viewport_flags(struct draw_context *draw);
>> +
>>  /**
>>   * Return index i from the index buffer.
>>   * If the index buffer would overflow we return the
>> diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_emit.c 
>> b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_emit.c
>> index c675321..50f438c 100644
>> --- a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_emit.c
>> +++ b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_emit.c
>> @@ -95,7 +95,7 @@ fse_prepare(struct draw_pt_middle_end *middle,
>>     fse->key.nr_elements = MAX2(fse->key.nr_outputs,     /* outputs - 
>> translate to hw format */
>>                                 fse->key.nr_inputs);     /* inputs - fetch 
>> from api format */
>>
>> -   fse->key.viewport = !draw->identity_viewport;
>> +   fse->key.viewport = !draw->bypass_viewport;
>>     fse->key.clip = draw->clip_xy || draw->clip_z || draw->clip_user;
>>     fse->key.const_vbuffers = 0;
>>
>> diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c 
>> b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c
>> index f518dee..5af845f 100644
>> --- a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c
>> +++ b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline.c
>> @@ -117,7 +117,7 @@ fetch_pipeline_prepare(struct draw_pt_middle_end *middle,
>>                              draw->clip_user,
>>                              point_clip ? draw->guard_band_points_xy :
>>                                           draw->guard_band_xy,
>> -                            draw->identity_viewport,
>> +                            draw->bypass_viewport,
>>                              draw->rasterizer->clip_halfz,
>>                              (draw->vs.edgeflag_output ? TRUE : FALSE) );
>>
>> diff --git a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c 
>> b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c
>> index 49341ff..06bd4e9 100644
>> --- a/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c
>> +++ b/src/gallium/auxiliary/draw/draw_pt_fetch_shade_pipeline_llvm.c
>> @@ -162,7 +162,7 @@ llvm_middle_end_prepare( struct draw_pt_middle_end 
>> *middle,
>>                              draw->clip_user,
>>                              point_clip ? draw->guard_band_points_xy :
>>                                           draw->guard_band_xy,
>> -                            draw->identity_viewport,
>> +                            draw->bypass_viewport,
>>                              draw->rasterizer->clip_halfz,
>>                              (draw->vs.edgeflag_output ? TRUE : FALSE) );
>>
>> diff --git a/src/gallium/auxiliary/draw/draw_vs.c 
>> b/src/gallium/auxiliary/draw/draw_vs.c
>> index dc50870..73334d7 100644
>> --- a/src/gallium/auxiliary/draw/draw_vs.c
>> +++ b/src/gallium/auxiliary/draw/draw_vs.c
>> @@ -120,6 +120,8 @@ draw_bind_vertex_shader(struct draw_context *draw,
>>        draw->vs.clipdistance_output[0] = dvs->clipdistance_output[0];
>>        draw->vs.clipdistance_output[1] = dvs->clipdistance_output[1];
>>        dvs->prepare( dvs, draw );
>> +      draw_update_clip_flags(draw);
>> +      draw_update_viewport_flags(draw);
I think technically you're also supposed to call these when you hit the
else clause below (going from a window space vs to no vs is supposed to
change the key). Doubt it will make any difference in practice, though...

>>     }
>>     else {
>>        draw->vs.vertex_shader = NULL;
>> diff --git a/src/gallium/drivers/llvmpipe/lp_screen.c 
>> b/src/gallium/drivers/llvmpipe/lp_screen.c
>> index cec0fcb..bea2dc7 100644
>> --- a/src/gallium/drivers/llvmpipe/lp_screen.c
>> +++ b/src/gallium/drivers/llvmpipe/lp_screen.c
>> @@ -251,7 +251,9 @@ llvmpipe_get_param(struct pipe_screen *screen, enum 
>> pipe_cap param)
>>     case PIPE_CAP_TEXTURE_QUERY_LOD:
>>     case PIPE_CAP_SAMPLE_SHADING:
>>     case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
>> +      return 0;
>>     case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
>> +      return 1;
>>     case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
>>     case PIPE_CAP_SAMPLER_VIEW_TARGET:
>>        return 0;
>> diff --git a/src/gallium/drivers/r300/r300_screen.c 
>> b/src/gallium/drivers/r300/r300_screen.c
>> index 47616f6..e653eab 100644
>> --- a/src/gallium/drivers/r300/r300_screen.c
>> +++ b/src/gallium/drivers/r300/r300_screen.c
>> @@ -177,7 +177,6 @@ static int r300_get_param(struct pipe_screen* pscreen, 
>> enum pipe_cap param)
>>          case PIPE_CAP_FAKE_SW_MSAA:
>>          case PIPE_CAP_SAMPLE_SHADING:
>>          case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
>> -        case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
>>          case PIPE_CAP_DRAW_INDIRECT:
>>          case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
>>          case PIPE_CAP_CONDITIONAL_RENDER_INVERTED:
>> @@ -187,6 +186,7 @@ static int r300_get_param(struct pipe_screen* pscreen, 
>> enum pipe_cap param)
>>          /* SWTCL-only features. */
>>          case PIPE_CAP_PRIMITIVE_RESTART:
>>          case PIPE_CAP_USER_VERTEX_BUFFERS:
>> +        case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
>>              return !r300screen->caps.has_tcl;
>>
>>          /* HWTCL-only features / limitations. */
>> diff --git a/src/gallium/drivers/softpipe/sp_screen.c 
>> b/src/gallium/drivers/softpipe/sp_screen.c
>> index 47126ef..57cd9b6 100644
>> --- a/src/gallium/drivers/softpipe/sp_screen.c
>> +++ b/src/gallium/drivers/softpipe/sp_screen.c
>> @@ -196,7 +196,9 @@ softpipe_get_param(struct pipe_screen *screen, enum 
>> pipe_cap param)
>>     case PIPE_CAP_TEXTURE_QUERY_LOD:
>>     case PIPE_CAP_SAMPLE_SHADING:
>>     case PIPE_CAP_TEXTURE_GATHER_OFFSETS:
>> +      return 0;
>>     case PIPE_CAP_TGSI_VS_WINDOW_SPACE_POSITION:
>> +      return 1;
>>     case PIPE_CAP_TGSI_FS_FINE_DERIVATIVE:
>>     case PIPE_CAP_SAMPLER_VIEW_TARGET:
>>        return 0;
>> --
>> 2.1.0
>>

Other than that, looks ok to me. I wonder though if adding this shader
property was really worth it, makes the logic of these bits even less
intuitive (as there's now 3 sources for them, rasterizer bits, shader
property bits, drivers wanting to disable them  - and in case of the
latter drivers would still need to check for the shader property on
their own if they actually do their own clipping).

Roland


_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to