On 12.06.2013 15:57, Jose Fonseca wrote: > > > ----- Original Message ----- >> Am 11.06.2013 05:39, schrieb Zack Rusin: >>> There are strict limits on those registers. Define the maximums >>> and use them instead of magic numbers. Also allows us to add >>> some extra sanity checks. >>> Suggested by Brian. >>> >>> Signed-off-by: Zack Rusin <za...@vmware.com> >>> --- >>> src/gallium/auxiliary/draw/draw_context.c | 2 ++ >>> src/gallium/auxiliary/draw/draw_gs.c | 10 +++++----- >>> src/gallium/auxiliary/draw/draw_gs.h | 4 ++-- >>> src/gallium/auxiliary/draw/draw_vs.c | 10 +++++----- >>> src/gallium/auxiliary/draw/draw_vs.h | 4 ++-- >>> src/gallium/docs/source/tgsi.rst | 23 +++++++++++++++++++++++ >>> src/gallium/include/pipe/p_state.h | 2 ++ >>> 7 files changed, 41 insertions(+), 14 deletions(-) >>> >>> diff --git a/src/gallium/auxiliary/draw/draw_context.c >>> b/src/gallium/auxiliary/draw/draw_context.c >>> index 0dbddb4..22c0e9b 100644 >>> --- a/src/gallium/auxiliary/draw/draw_context.c >>> +++ b/src/gallium/auxiliary/draw/draw_context.c >>> @@ -738,6 +738,7 @@ draw_current_shader_clipvertex_output(const struct >>> draw_context *draw) >>> uint >>> draw_current_shader_clipdistance_output(const struct draw_context *draw, >>> int index) >>> { >>> + debug_assert(index < PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT); >>> if (draw->gs.geometry_shader) >>> return draw->gs.geometry_shader->clipdistance_output[index]; >>> return draw->vs.clipdistance_output[index]; >>> @@ -756,6 +757,7 @@ draw_current_shader_num_written_clipdistances(const >>> struct draw_context *draw) >>> uint >>> draw_current_shader_culldistance_output(const struct draw_context *draw, >>> int index) >>> { >>> + debug_assert(index < PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT); >>> if (draw->gs.geometry_shader) >>> return draw->gs.geometry_shader->culldistance_output[index]; >>> return draw->vs.vertex_shader->culldistance_output[index]; >>> diff --git a/src/gallium/auxiliary/draw/draw_gs.c >>> b/src/gallium/auxiliary/draw/draw_gs.c >>> index b762dd6..cd63e2b 100644 >>> --- a/src/gallium/auxiliary/draw/draw_gs.c >>> +++ b/src/gallium/auxiliary/draw/draw_gs.c >>> @@ -792,13 +792,13 @@ draw_create_geometry_shader(struct draw_context >>> *draw, >>> if (gs->info.output_semantic_name[i] == >>> TGSI_SEMANTIC_VIEWPORT_INDEX) >>> gs->viewport_index_output = i; >>> if (gs->info.output_semantic_name[i] == TGSI_SEMANTIC_CLIPDIST) { >>> - if (gs->info.output_semantic_index[i] == 0) >>> - gs->clipdistance_output[0] = i; >>> - else >>> - gs->clipdistance_output[1] = i; >>> + debug_assert(gs->info.output_semantic_index[i] < >>> + PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT); >>> + gs->clipdistance_output[gs->info.output_semantic_index[i]] = i; >>> } >>> if (gs->info.output_semantic_name[i] == TGSI_SEMANTIC_CULLDIST) { >>> - debug_assert(gs->info.output_semantic_index[i] < >>> Elements(gs->culldistance_output)); >>> + debug_assert(gs->info.output_semantic_index[i] < >>> + PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT); >>> gs->culldistance_output[gs->info.output_semantic_index[i]] = i; >>> } >>> } >>> diff --git a/src/gallium/auxiliary/draw/draw_gs.h >>> b/src/gallium/auxiliary/draw/draw_gs.h >>> index 05d666d..e279a80 100644 >>> --- a/src/gallium/auxiliary/draw/draw_gs.h >>> +++ b/src/gallium/auxiliary/draw/draw_gs.h >>> @@ -67,8 +67,8 @@ struct draw_geometry_shader { >>> struct tgsi_shader_info info; >>> unsigned position_output; >>> unsigned viewport_index_output; >>> - unsigned clipdistance_output[2]; >>> - unsigned culldistance_output[2]; >>> + unsigned >>> clipdistance_output[PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT]; >>> + unsigned >>> culldistance_output[PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT]; >>> >>> unsigned max_output_vertices; >>> unsigned primitive_boundary; >>> diff --git a/src/gallium/auxiliary/draw/draw_vs.c >>> b/src/gallium/auxiliary/draw/draw_vs.c >>> index a0bebcc..bbccbe4 100644 >>> --- a/src/gallium/auxiliary/draw/draw_vs.c >>> +++ b/src/gallium/auxiliary/draw/draw_vs.c >>> @@ -86,12 +86,12 @@ draw_create_vertex_shader(struct draw_context *draw, >>> found_clipvertex = TRUE; >>> vs->clipvertex_output = i; >>> } else if (vs->info.output_semantic_name[i] == >>> TGSI_SEMANTIC_CLIPDIST) { >>> - if (vs->info.output_semantic_index[i] == 0) >>> - vs->clipdistance_output[0] = i; >>> - else >>> - vs->clipdistance_output[1] = i; >>> + debug_assert(vs->info.output_semantic_index[i] < >>> + PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT); >>> + vs->clipdistance_output[vs->info.output_semantic_index[i]] = >>> i; >>> } else if (vs->info.output_semantic_name[i] == >>> TGSI_SEMANTIC_CULLDIST) { >>> - debug_assert(vs->info.output_semantic_index[i] < >>> Elements(vs->culldistance_output)); >>> + debug_assert(vs->info.output_semantic_index[i] < >>> + PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT); >>> vs->culldistance_output[vs->info.output_semantic_index[i]] = >>> i; >>> } >>> } >>> diff --git a/src/gallium/auxiliary/draw/draw_vs.h >>> b/src/gallium/auxiliary/draw/draw_vs.h >>> index 7635aba..425efa3 100644 >>> --- a/src/gallium/auxiliary/draw/draw_vs.h >>> +++ b/src/gallium/auxiliary/draw/draw_vs.h >>> @@ -112,8 +112,8 @@ struct draw_vertex_shader { >>> unsigned position_output; >>> unsigned edgeflag_output; >>> unsigned clipvertex_output; >>> - unsigned clipdistance_output[2]; >>> - unsigned culldistance_output[2]; >>> + unsigned >>> clipdistance_output[PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT]; >>> + unsigned >>> culldistance_output[PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT]; >>> /* Extracted from shader: >>> */ >>> const float (*immediates)[4]; >>> diff --git a/src/gallium/docs/source/tgsi.rst >>> b/src/gallium/docs/source/tgsi.rst >>> index f3aebb3..3f48b51 100644 >>> --- a/src/gallium/docs/source/tgsi.rst >>> +++ b/src/gallium/docs/source/tgsi.rst >>> @@ -2435,6 +2435,29 @@ float32 signed distance to a plane. Primitives will >>> be completely >>> discarded if the plane distance for all of the vertices in the >>> primitive are < 0. If a vertex has a cull distance of NaN, that >>> vertex counts as "out" (as if its < 0); >>> +The limits on both clip and cull distances are bound >>> +by the PIPE_MAX_CLIP_OR_CULL_DISTANCE_COUNT define which defines >>> +the maximum number of components that can be used to hold the >>> +distances and by the PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT >>> +which specifies the maximum number of registers which can be >>> +annotated with those semantics. >>> + >>> + >>> +TGSI_SEMANTIC_CLIPDIST >>> +"""""""""""""""""""""" >>> + >>> +When components of vertex elements are identified this way, these >>> +values are each assumed to be a float32 signed distance to a plane. >>> +Primitive setup only invokes rasterization on pixels for which >>> +the interpolated plane distances are >= 0. Multiple clip planes >>> +can be implemented simultaneously, by annotating multiple >>> +components of one or more vertex elements with the above specified >>> +semantic. The limits on both clip and cull distances are bound >>> +by the PIPE_MAX_CLIP_OR_CULL_DISTANCE_COUNT define which defines >>> +the maximum number of components that can be used to hold the >>> +distances and by the PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT >>> +which specifies the maximum number of registers which can be >>> +annotated with those semantics. >>> >>> >>> Declaration Interpolate >>> diff --git a/src/gallium/include/pipe/p_state.h >>> b/src/gallium/include/pipe/p_state.h >>> index ff0aac7..29e8cc9 100644 >>> --- a/src/gallium/include/pipe/p_state.h >>> +++ b/src/gallium/include/pipe/p_state.h >>> @@ -66,6 +66,8 @@ extern "C" { >>> #define PIPE_MAX_SO_BUFFERS 4 >>> #define PIPE_MAX_SO_OUTPUTS 64 >>> #define PIPE_MAX_VIEWPORTS 16 >>> +#define PIPE_MAX_CLIP_OR_CULL_DISTANCE_COUNT 8 >>> +#define PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT 2 >>>
Isn't it a bit ambiguous to call it "ELEMENT" count ? Wouldn't you equate a clip distance element to a vector element, i.e. a component ? At least I was a bit confused at first, maybe you were thinking more along the lines of a vertex element. Making it "VEC4_COUNT" or "REGISTER_COUNT" would be better I think. On an unrelated note ... packing clip distances into vec4s sucks, I want scalar arrays. >>> >>> struct pipe_reference >>> >> >> Series looks good to me. > > Same here. > > Jose > _______________________________________________ > mesa-dev mailing list > mesa-dev@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/mesa-dev > _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev