diff options
-rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_ureg.c | 153 | ||||
-rw-r--r-- | src/gallium/auxiliary/tgsi/tgsi_ureg.h | 35 | ||||
-rw-r--r-- | src/gallium/auxiliary/util/u_simple_shaders.c | 2 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_glsl_to_tgsi.cpp | 12 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_mesa_to_tgsi.c | 12 | ||||
-rw-r--r-- | src/mesa/state_tracker/st_program.c | 23 |
6 files changed, 43 insertions, 194 deletions
diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c b/src/gallium/auxiliary/tgsi/tgsi_ureg.c index 6d3ac918a59..f524dfbca5c 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c @@ -165,15 +165,7 @@ struct ureg_program struct const_decl const_decls; struct const_decl const_decls2D[PIPE_MAX_CONSTANT_BUFFERS]; - unsigned property_gs_input_prim; - unsigned property_gs_output_prim; - unsigned property_gs_max_vertices; - unsigned property_gs_invocations; - unsigned char property_fs_coord_origin; /* = TGSI_FS_COORD_ORIGIN_* */ - unsigned char property_fs_coord_pixel_center; /* = TGSI_FS_COORD_PIXEL_CENTER_* */ - unsigned char property_fs_color0_writes_all_cbufs; /* = TGSI_FS_COLOR0_WRITES_ALL_CBUFS * */ - unsigned char property_fs_depth_layout; /* TGSI_FS_DEPTH_LAYOUT */ - boolean property_vs_window_space_position; /* TGSI_VS_WINDOW_SPACE_POSITION */ + unsigned properties[TGSI_PROPERTY_COUNT]; unsigned nr_addrs; unsigned nr_preds; @@ -278,65 +270,10 @@ ureg_dst_register( unsigned file, void -ureg_property_gs_input_prim(struct ureg_program *ureg, - unsigned input_prim) +ureg_property(struct ureg_program *ureg, unsigned name, unsigned value) { - ureg->property_gs_input_prim = input_prim; -} - -void -ureg_property_gs_output_prim(struct ureg_program *ureg, - unsigned output_prim) -{ - ureg->property_gs_output_prim = output_prim; -} - -void -ureg_property_gs_max_vertices(struct ureg_program *ureg, - unsigned max_vertices) -{ - ureg->property_gs_max_vertices = max_vertices; -} -void -ureg_property_gs_invocations(struct ureg_program *ureg, - unsigned invocations) -{ - ureg->property_gs_invocations = invocations; -} - -void -ureg_property_fs_coord_origin(struct ureg_program *ureg, - unsigned fs_coord_origin) -{ - ureg->property_fs_coord_origin = fs_coord_origin; -} - -void -ureg_property_fs_coord_pixel_center(struct ureg_program *ureg, - unsigned fs_coord_pixel_center) -{ - ureg->property_fs_coord_pixel_center = fs_coord_pixel_center; -} - -void -ureg_property_fs_color0_writes_all_cbufs(struct ureg_program *ureg, - unsigned fs_color0_writes_all_cbufs) -{ - ureg->property_fs_color0_writes_all_cbufs = fs_color0_writes_all_cbufs; -} - -void -ureg_property_fs_depth_layout(struct ureg_program *ureg, - unsigned fs_depth_layout) -{ - ureg->property_fs_depth_layout = fs_depth_layout; -} - -void -ureg_property_vs_window_space_position(struct ureg_program *ureg, - boolean vs_window_space_position) -{ - ureg->property_vs_window_space_position = vs_window_space_position; + assert(name < Elements(ureg->properties)); + ureg->properties[name] = value; } struct ureg_src @@ -1452,77 +1389,9 @@ static void emit_decls( struct ureg_program *ureg ) { unsigned i; - if (ureg->property_gs_input_prim != ~0) { - assert(ureg->processor == TGSI_PROCESSOR_GEOMETRY); - - emit_property(ureg, - TGSI_PROPERTY_GS_INPUT_PRIM, - ureg->property_gs_input_prim); - } - - if (ureg->property_gs_output_prim != ~0) { - assert(ureg->processor == TGSI_PROCESSOR_GEOMETRY); - - emit_property(ureg, - TGSI_PROPERTY_GS_OUTPUT_PRIM, - ureg->property_gs_output_prim); - } - - if (ureg->property_gs_max_vertices != ~0) { - assert(ureg->processor == TGSI_PROCESSOR_GEOMETRY); - - emit_property(ureg, - TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES, - ureg->property_gs_max_vertices); - } - - if (ureg->property_gs_invocations != ~0) { - assert(ureg->processor == TGSI_PROCESSOR_GEOMETRY); - - emit_property(ureg, - TGSI_PROPERTY_GS_INVOCATIONS, - ureg->property_gs_invocations); - } - - if (ureg->property_fs_coord_origin) { - assert(ureg->processor == TGSI_PROCESSOR_FRAGMENT); - - emit_property(ureg, - TGSI_PROPERTY_FS_COORD_ORIGIN, - ureg->property_fs_coord_origin); - } - - if (ureg->property_fs_coord_pixel_center) { - assert(ureg->processor == TGSI_PROCESSOR_FRAGMENT); - - emit_property(ureg, - TGSI_PROPERTY_FS_COORD_PIXEL_CENTER, - ureg->property_fs_coord_pixel_center); - } - - if (ureg->property_fs_color0_writes_all_cbufs) { - assert(ureg->processor == TGSI_PROCESSOR_FRAGMENT); - - emit_property(ureg, - TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS, - ureg->property_fs_color0_writes_all_cbufs); - } - - if (ureg->property_fs_depth_layout) { - assert(ureg->processor == TGSI_PROCESSOR_FRAGMENT); - - emit_property(ureg, - TGSI_PROPERTY_FS_DEPTH_LAYOUT, - ureg->property_fs_depth_layout); - } - - if (ureg->property_vs_window_space_position) { - assert(ureg->processor == TGSI_PROCESSOR_VERTEX); - - emit_property(ureg, - TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION, - ureg->property_vs_window_space_position); - } + for (i = 0; i < Elements(ureg->properties); i++) + if (ureg->properties[i] != ~0) + emit_property(ureg, i, ureg->properties[i]); if (ureg->processor == TGSI_PROCESSOR_VERTEX) { for (i = 0; i < UREG_MAX_INPUT; i++) { @@ -1773,15 +1642,15 @@ void ureg_free_tokens( const struct tgsi_token *tokens ) struct ureg_program *ureg_create( unsigned processor ) { + int i; struct ureg_program *ureg = CALLOC_STRUCT( ureg_program ); if (ureg == NULL) goto no_ureg; ureg->processor = processor; - ureg->property_gs_input_prim = ~0; - ureg->property_gs_output_prim = ~0; - ureg->property_gs_max_vertices = ~0; - ureg->property_gs_invocations = ~0; + + for (i = 0; i < Elements(ureg->properties); i++) + ureg->properties[i] = ~0; ureg->free_temps = util_bitmask_create(); if (ureg->free_temps == NULL) diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.h b/src/gallium/auxiliary/tgsi/tgsi_ureg.h index f014b5304a5..f254b1eb1a8 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.h +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.h @@ -153,40 +153,7 @@ ureg_create_shader_and_destroy( struct ureg_program *p, */ void -ureg_property_gs_input_prim(struct ureg_program *ureg, - unsigned input_prim); - -void -ureg_property_gs_output_prim(struct ureg_program *ureg, - unsigned output_prim); - -void -ureg_property_gs_max_vertices(struct ureg_program *ureg, - unsigned max_vertices); - -void -ureg_property_gs_invocations(struct ureg_program *ureg, - unsigned invocations); - -void -ureg_property_fs_coord_origin(struct ureg_program *ureg, - unsigned fs_coord_origin); - -void -ureg_property_fs_coord_pixel_center(struct ureg_program *ureg, - unsigned fs_coord_pixel_center); - -void -ureg_property_fs_color0_writes_all_cbufs(struct ureg_program *ureg, - unsigned fs_color0_writes_all_cbufs); - -void -ureg_property_fs_depth_layout(struct ureg_program *ureg, - unsigned fs_depth_layout); - -void -ureg_property_vs_window_space_position(struct ureg_program *ureg, - boolean vs_window_space_position); +ureg_property(struct ureg_program *ureg, unsigned name, unsigned value); /*********************************************************************** diff --git a/src/gallium/auxiliary/util/u_simple_shaders.c b/src/gallium/auxiliary/util/u_simple_shaders.c index 280ed8f4cb9..0eeb7d99173 100644 --- a/src/gallium/auxiliary/util/u_simple_shaders.c +++ b/src/gallium/auxiliary/util/u_simple_shaders.c @@ -84,7 +84,7 @@ util_make_vertex_passthrough_shader_with_so(struct pipe_context *pipe, return NULL; if (window_space) - ureg_property_vs_window_space_position(ureg, TRUE); + ureg_property(ureg, TGSI_PROPERTY_VS_WINDOW_SPACE_POSITION, TRUE); for (i = 0; i < num_attribs; i++) { struct ureg_src src; diff --git a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp index a4e2c8da586..c10ad7538cd 100644 --- a/src/mesa/state_tracker/st_glsl_to_tgsi.cpp +++ b/src/mesa/state_tracker/st_glsl_to_tgsi.cpp @@ -4721,7 +4721,8 @@ emit_wpos(struct st_context *st, } else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT)) { /* the driver supports lower-left origin, need to invert Y */ - ureg_property_fs_coord_origin(ureg, TGSI_FS_COORD_ORIGIN_LOWER_LEFT); + ureg_property(ureg, TGSI_PROPERTY_FS_COORD_ORIGIN, + TGSI_FS_COORD_ORIGIN_LOWER_LEFT); invert = TRUE; } else @@ -4731,7 +4732,8 @@ emit_wpos(struct st_context *st, /* Fragment shader wants origin in lower-left */ if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT)) /* the driver supports lower-left origin */ - ureg_property_fs_coord_origin(ureg, TGSI_FS_COORD_ORIGIN_LOWER_LEFT); + ureg_property(ureg, TGSI_PROPERTY_FS_COORD_ORIGIN, + TGSI_FS_COORD_ORIGIN_LOWER_LEFT); else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT)) /* the driver supports upper-left origin, need to invert Y */ invert = TRUE; @@ -4744,7 +4746,8 @@ emit_wpos(struct st_context *st, if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER)) { /* the driver supports pixel center integer */ adjY[1] = 1.0f; - ureg_property_fs_coord_pixel_center(ureg, TGSI_FS_COORD_PIXEL_CENTER_INTEGER); + ureg_property(ureg, TGSI_PROPERTY_FS_COORD_PIXEL_CENTER, + TGSI_FS_COORD_PIXEL_CENTER_INTEGER); } else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER)) { /* the driver supports pixel center half integer, need to bias X,Y */ @@ -4763,7 +4766,8 @@ emit_wpos(struct st_context *st, else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER)) { /* the driver supports pixel center integer, need to bias X,Y */ adjX = adjY[0] = adjY[1] = 0.5f; - ureg_property_fs_coord_pixel_center(ureg, TGSI_FS_COORD_PIXEL_CENTER_INTEGER); + ureg_property(ureg, TGSI_PROPERTY_FS_COORD_PIXEL_CENTER, + TGSI_FS_COORD_PIXEL_CENTER_INTEGER); } else assert(0); diff --git a/src/mesa/state_tracker/st_mesa_to_tgsi.c b/src/mesa/state_tracker/st_mesa_to_tgsi.c index 26a5f51c77c..2c9d9a523f4 100644 --- a/src/mesa/state_tracker/st_mesa_to_tgsi.c +++ b/src/mesa/state_tracker/st_mesa_to_tgsi.c @@ -891,7 +891,8 @@ emit_wpos(struct st_context *st, } else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT)) { /* the driver supports lower-left origin, need to invert Y */ - ureg_property_fs_coord_origin(ureg, TGSI_FS_COORD_ORIGIN_LOWER_LEFT); + ureg_property(ureg, TGSI_PROPERTY_FS_COORD_ORIGIN, + TGSI_FS_COORD_ORIGIN_LOWER_LEFT); invert = TRUE; } else @@ -901,7 +902,8 @@ emit_wpos(struct st_context *st, /* Fragment shader wants origin in lower-left */ if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_LOWER_LEFT)) /* the driver supports lower-left origin */ - ureg_property_fs_coord_origin(ureg, TGSI_FS_COORD_ORIGIN_LOWER_LEFT); + ureg_property(ureg, TGSI_PROPERTY_FS_COORD_ORIGIN, + TGSI_FS_COORD_ORIGIN_LOWER_LEFT); else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_ORIGIN_UPPER_LEFT)) /* the driver supports upper-left origin, need to invert Y */ invert = TRUE; @@ -914,7 +916,8 @@ emit_wpos(struct st_context *st, if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER)) { /* the driver supports pixel center integer */ adjY[1] = 1.0f; - ureg_property_fs_coord_pixel_center(ureg, TGSI_FS_COORD_PIXEL_CENTER_INTEGER); + ureg_property(ureg, TGSI_PROPERTY_FS_COORD_PIXEL_CENTER, + TGSI_FS_COORD_PIXEL_CENTER_INTEGER); } else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_HALF_INTEGER)) { /* the driver supports pixel center half integer, need to bias X,Y */ @@ -933,7 +936,8 @@ emit_wpos(struct st_context *st, else if (pscreen->get_param(pscreen, PIPE_CAP_TGSI_FS_COORD_PIXEL_CENTER_INTEGER)) { /* the driver supports pixel center integer, need to bias X,Y */ adjX = adjY[0] = adjY[1] = 0.5f; - ureg_property_fs_coord_pixel_center(ureg, TGSI_FS_COORD_PIXEL_CENTER_INTEGER); + ureg_property(ureg, TGSI_PROPERTY_FS_COORD_PIXEL_CENTER, + TGSI_FS_COORD_PIXEL_CENTER_INTEGER); } else assert(0); diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c index 926086bf898..737c2694e7f 100644 --- a/src/mesa/state_tracker/st_program.c +++ b/src/mesa/state_tracker/st_program.c @@ -742,21 +742,25 @@ st_translate_fragment_program(struct st_context *st, debug_printf("\n"); } if (write_all == GL_TRUE) - ureg_property_fs_color0_writes_all_cbufs(ureg, 1); + ureg_property(ureg, TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS, 1); if (stfp->Base.FragDepthLayout != FRAG_DEPTH_LAYOUT_NONE) { switch (stfp->Base.FragDepthLayout) { case FRAG_DEPTH_LAYOUT_ANY: - ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_ANY); + ureg_property(ureg, TGSI_PROPERTY_FS_DEPTH_LAYOUT, + TGSI_FS_DEPTH_LAYOUT_ANY); break; case FRAG_DEPTH_LAYOUT_GREATER: - ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_GREATER); + ureg_property(ureg, TGSI_PROPERTY_FS_DEPTH_LAYOUT, + TGSI_FS_DEPTH_LAYOUT_GREATER); break; case FRAG_DEPTH_LAYOUT_LESS: - ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_LESS); + ureg_property(ureg, TGSI_PROPERTY_FS_DEPTH_LAYOUT, + TGSI_FS_DEPTH_LAYOUT_LESS); break; case FRAG_DEPTH_LAYOUT_UNCHANGED: - ureg_property_fs_depth_layout(ureg, TGSI_FS_DEPTH_LAYOUT_UNCHANGED); + ureg_property(ureg, TGSI_PROPERTY_FS_DEPTH_LAYOUT, + TGSI_FS_DEPTH_LAYOUT_UNCHANGED); break; default: assert(0); @@ -1122,10 +1126,11 @@ st_translate_geometry_program(struct st_context *st, stgp->tgsi.tokens = NULL; } - ureg_property_gs_input_prim(ureg, stgp->Base.InputType); - ureg_property_gs_output_prim(ureg, stgp->Base.OutputType); - ureg_property_gs_max_vertices(ureg, stgp->Base.VerticesOut); - ureg_property_gs_invocations(ureg, stgp->Base.Invocations); + ureg_property(ureg, TGSI_PROPERTY_GS_INPUT_PRIM, stgp->Base.InputType); + ureg_property(ureg, TGSI_PROPERTY_GS_OUTPUT_PRIM, stgp->Base.OutputType); + ureg_property(ureg, TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES, + stgp->Base.VerticesOut); + ureg_property(ureg, TGSI_PROPERTY_GS_INVOCATIONS, stgp->Base.Invocations); if (stgp->glsl_to_tgsi) st_translate_program(st->ctx, |