From: Marek Olšák Date: Tue, 30 Sep 2014 13:48:22 +0000 (+0200) Subject: tgsi: simplify shader properties in tgsi_shader_info X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8908fae243cb4c15a675006a1cc472f6c59b0d43;p=mesa.git tgsi: simplify shader properties in tgsi_shader_info Use an array of properties indexed by TGSI_PROPERTY_* definitions. --- diff --git a/src/gallium/auxiliary/draw/draw_gs.c b/src/gallium/auxiliary/draw/draw_gs.c index 878fccabc07..0c2f8922dc5 100644 --- a/src/gallium/auxiliary/draw/draw_gs.c +++ b/src/gallium/auxiliary/draw/draw_gs.c @@ -750,9 +750,6 @@ draw_create_geometry_shader(struct draw_context *draw, tgsi_scan_shader(state->tokens, &gs->info); /* setup the defaults */ - gs->input_primitive = PIPE_PRIM_TRIANGLES; - gs->output_primitive = PIPE_PRIM_TRIANGLE_STRIP; - gs->max_output_vertices = 32; gs->max_out_prims = 0; #ifdef HAVE_LLVM @@ -768,17 +765,15 @@ draw_create_geometry_shader(struct draw_context *draw, gs->vector_length = 1; } - for (i = 0; i < gs->info.num_properties; ++i) { - if (gs->info.properties[i].name == - TGSI_PROPERTY_GS_INPUT_PRIM) - gs->input_primitive = gs->info.properties[i].data[0]; - else if (gs->info.properties[i].name == - TGSI_PROPERTY_GS_OUTPUT_PRIM) - gs->output_primitive = gs->info.properties[i].data[0]; - else if (gs->info.properties[i].name == - TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES) - gs->max_output_vertices = gs->info.properties[i].data[0]; - } + gs->input_primitive = + gs->info.properties[TGSI_PROPERTY_GS_INPUT_PRIM][0]; + gs->output_primitive = + gs->info.properties[TGSI_PROPERTY_GS_OUTPUT_PRIM][0]; + gs->max_output_vertices = + gs->info.properties[TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES][0]; + if (!gs->max_output_vertices) + gs->max_output_vertices = 32; + /* Primitive boundary is bigger than max_output_vertices by one, because * the specification says that the geometry shader should exit if the * number of emitted vertices is bigger or equal to max_output_vertices and diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c index c0bd7bec193..2d7f32d308d 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c @@ -3855,8 +3855,8 @@ lp_build_tgsi_soa(struct gallivm_state *gallivm, * were forgetting so we're using MAX_VERTEX_VARYING from * that spec even though we could debug_assert if it's not * set, but that's a lot uglier. */ - uint max_output_vertices = 32; - uint i = 0; + uint max_output_vertices; + /* inputs are always indirect with gs */ bld.indirect_files |= (1 << TGSI_FILE_INPUT); bld.gs_iface = gs_iface; @@ -3864,12 +3864,11 @@ lp_build_tgsi_soa(struct gallivm_state *gallivm, bld.bld_base.op_actions[TGSI_OPCODE_EMIT].emit = emit_vertex; bld.bld_base.op_actions[TGSI_OPCODE_ENDPRIM].emit = end_primitive; - for (i = 0; i < info->num_properties; ++i) { - if (info->properties[i].name == - TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES) { - max_output_vertices = info->properties[i].data[0]; - } - } + max_output_vertices = + info->properties[TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES][0]; + if (!max_output_vertices) + max_output_vertices = 32; + bld.max_output_vertices_vec = lp_build_const_int_vec(gallivm, bld.bld_base.int_bld.type, max_output_vertices); diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.c b/src/gallium/auxiliary/tgsi/tgsi_scan.c index c71bb360bb3..f9d189602ca 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_scan.c +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.c @@ -277,13 +277,11 @@ tgsi_scan_shader(const struct tgsi_token *tokens, { const struct tgsi_full_property *fullprop = &parse.FullToken.FullProperty; + unsigned name = fullprop->Property.PropertyName; - info->properties[info->num_properties].name = - fullprop->Property.PropertyName; - memcpy(info->properties[info->num_properties].data, - fullprop->u, 8 * sizeof(unsigned));; - - ++info->num_properties; + assert(name < Elements(info->properties)); + memcpy(info->properties[name], + fullprop->u, 8 * sizeof(unsigned)); } break; @@ -296,35 +294,26 @@ tgsi_scan_shader(const struct tgsi_token *tokens, info->opcode_count[TGSI_OPCODE_KILL]); /* extract simple properties */ - for (i = 0; i < info->num_properties; ++i) { - switch (info->properties[i].name) { - case TGSI_PROPERTY_FS_COORD_ORIGIN: - info->origin_lower_left = info->properties[i].data[0]; - break; - case TGSI_PROPERTY_FS_COORD_PIXEL_CENTER: - info->pixel_center_integer = info->properties[i].data[0]; - break; - case TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS: - info->color0_writes_all_cbufs = info->properties[i].data[0]; - break; - case TGSI_PROPERTY_GS_INPUT_PRIM: - /* The dimensions of the IN decleration in geometry shader have - * to be deduced from the type of the input primitive. - */ - if (procType == TGSI_PROCESSOR_GEOMETRY) { - unsigned input_primitive = info->properties[i].data[0]; - int num_verts = u_vertices_per_prim(input_primitive); - int j; - info->file_count[TGSI_FILE_INPUT] = num_verts; - info->file_max[TGSI_FILE_INPUT] = - MAX2(info->file_max[TGSI_FILE_INPUT], num_verts - 1); - for (j = 0; j < num_verts; ++j) { - info->file_mask[TGSI_FILE_INPUT] |= (1 << j); - } - } - break; - default: - ; + info->origin_lower_left = + info->properties[TGSI_PROPERTY_FS_COORD_ORIGIN][0]; + info->pixel_center_integer = + info->properties[TGSI_PROPERTY_FS_COORD_PIXEL_CENTER][0]; + info->color0_writes_all_cbufs = + info->properties[TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS][0]; + + /* The dimensions of the IN decleration in geometry shader have + * to be deduced from the type of the input primitive. + */ + if (procType == TGSI_PROCESSOR_GEOMETRY) { + unsigned input_primitive = + info->properties[TGSI_PROPERTY_GS_INPUT_PRIM][0]; + int num_verts = u_vertices_per_prim(input_primitive); + int j; + info->file_count[TGSI_FILE_INPUT] = num_verts; + info->file_max[TGSI_FILE_INPUT] = + MAX2(info->file_max[TGSI_FILE_INPUT], num_verts - 1); + for (j = 0; j < num_verts; ++j) { + info->file_mask[TGSI_FILE_INPUT] |= (1 << j); } } diff --git a/src/gallium/auxiliary/tgsi/tgsi_scan.h b/src/gallium/auxiliary/tgsi/tgsi_scan.h index 1869b41e74e..0d79e292209 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_scan.h +++ b/src/gallium/auxiliary/tgsi/tgsi_scan.h @@ -91,11 +91,7 @@ struct tgsi_shader_info */ unsigned indirect_files; - struct { - unsigned name; - unsigned data[8]; - } properties[TGSI_PROPERTY_COUNT]; - uint num_properties; + unsigned properties[TGSI_PROPERTY_COUNT][8]; /* index with TGSI_PROPERTY_ */ }; extern void diff --git a/src/gallium/auxiliary/util/u_pstipple.c b/src/gallium/auxiliary/util/u_pstipple.c index 4f2e7023499..ce1fe5dc683 100644 --- a/src/gallium/auxiliary/util/u_pstipple.c +++ b/src/gallium/auxiliary/util/u_pstipple.c @@ -407,7 +407,6 @@ util_pstipple_create_fragment_shader(struct pipe_context *pipe, struct pipe_shader_state *new_fs; struct pstip_transform_context transform; const uint newLen = tgsi_num_tokens(fs->tokens) + NUM_NEW_TOKENS; - unsigned i; new_fs = MALLOC(sizeof(*new_fs)); if (!new_fs) @@ -433,11 +432,8 @@ util_pstipple_create_fragment_shader(struct pipe_context *pipe, tgsi_scan_shader(fs->tokens, &transform.info); - /* find fragment coordinate origin property */ - for (i = 0; i < transform.info.num_properties; i++) { - if (transform.info.properties[i].name == TGSI_PROPERTY_FS_COORD_ORIGIN) - transform.coordOrigin = transform.info.properties[i].data[0]; - } + transform.coordOrigin = + transform.info.properties[TGSI_PROPERTY_FS_COORD_ORIGIN][0]; tgsi_transform_shader(fs->tokens, (struct tgsi_token *) new_fs->tokens, diff --git a/src/gallium/drivers/llvmpipe/lp_state_fs.c b/src/gallium/drivers/llvmpipe/lp_state_fs.c index ff2939d4db4..431f31efaf7 100644 --- a/src/gallium/drivers/llvmpipe/lp_state_fs.c +++ b/src/gallium/drivers/llvmpipe/lp_state_fs.c @@ -2212,14 +2212,8 @@ generate_fragment(struct llvmpipe_context *lp, } /* check if writes to cbuf[0] are to be copied to all cbufs */ - cbuf0_write_all = FALSE; - for (i = 0;i < shader->info.base.num_properties; i++) { - if (shader->info.base.properties[i].name == - TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS) { - cbuf0_write_all = TRUE; - break; - } - } + cbuf0_write_all = + shader->info.base.properties[TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS][0]; /* TODO: actually pick these based on the fs and color buffer * characteristics. */ diff --git a/src/gallium/drivers/nouveau/nv30/nvfx_fragprog.c b/src/gallium/drivers/nouveau/nv30/nvfx_fragprog.c index 1f1fba202df..774b14b0a47 100644 --- a/src/gallium/drivers/nouveau/nv30/nvfx_fragprog.c +++ b/src/gallium/drivers/nouveau/nv30/nvfx_fragprog.c @@ -1138,24 +1138,12 @@ _nvfx_fragprog_translate(uint16_t oclass, struct nv30_fragprog *fp) fpc->num_regs = 2; memset(fp->texcoord, 0xff, sizeof(fp->texcoord)); - for (unsigned i = 0; i < fp->info.num_properties; ++i) { - switch (fp->info.properties[i].name) { - case TGSI_PROPERTY_FS_COORD_ORIGIN: - if (fp->info.properties[i].data[0]) - fp->coord_conventions |= NV30_3D_COORD_CONVENTIONS_ORIGIN_INVERTED; - break; - case TGSI_PROPERTY_FS_COORD_PIXEL_CENTER: - if (fp->info.properties[i].data[0]) - fp->coord_conventions |= NV30_3D_COORD_CONVENTIONS_CENTER_INTEGER; - break; - case TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS: - if (fp->info.properties[i].data[0]) - fp->rt_enable |= NV30_3D_RT_ENABLE_MRT; - break; - default: - break; - } - } + if (fp->info.properties[TGSI_PROPERTY_FS_COORD_ORIGIN][0]) + fp->coord_conventions |= NV30_3D_COORD_CONVENTIONS_ORIGIN_INVERTED; + if (fp->info.properties[TGSI_PROPERTY_FS_COORD_PIXEL_CENTER][0]) + fp->coord_conventions |= NV30_3D_COORD_CONVENTIONS_CENTER_INTEGER; + if (fp->info.properties[TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS][0]) + fp->rt_enable |= NV30_3D_RT_ENABLE_MRT; if (!nvfx_fragprog_prepare(fpc)) goto out_err; diff --git a/src/gallium/drivers/r300/r300_fs.c b/src/gallium/drivers/r300/r300_fs.c index 6e1b4e44ad3..ddf944a28eb 100644 --- a/src/gallium/drivers/r300/r300_fs.c +++ b/src/gallium/drivers/r300/r300_fs.c @@ -468,12 +468,8 @@ static void r300_translate_fragment_shader( find_output_registers(&compiler, shader); - shader->write_all = FALSE; - for (i = 0; i < shader->info.num_properties; i++) { - if (shader->info.properties[i].name == TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS) { - shader->write_all = TRUE; - } - } + shader->write_all = + shader->info.properties[TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS][0]; if (compiler.Base.Debug & RC_DBG_LOG) { DBG(r300, DBG_FP, "r300: Initial fragment program\n"); diff --git a/src/gallium/drivers/radeonsi/si_shader.c b/src/gallium/drivers/radeonsi/si_shader.c index 276ba814d1d..5c3efd4c5f5 100644 --- a/src/gallium/drivers/radeonsi/si_shader.c +++ b/src/gallium/drivers/radeonsi/si_shader.c @@ -2866,52 +2866,33 @@ int si_shader_create(struct si_screen *sscreen, struct si_shader *shader) bld_base->emit_epilogue = si_llvm_emit_vs_epilogue; } break; - case TGSI_PROCESSOR_GEOMETRY: { - int i; - + case TGSI_PROCESSOR_GEOMETRY: si_shader_ctx.radeon_bld.load_input = declare_input_gs; bld_base->emit_fetch_funcs[TGSI_FILE_INPUT] = fetch_input_gs; bld_base->emit_epilogue = si_llvm_emit_gs_epilogue; - for (i = 0; i < sel->info.num_properties; i++) { - switch (sel->info.properties[i].name) { - case TGSI_PROPERTY_GS_INPUT_PRIM: - shader->gs_input_prim = sel->info.properties[i].data[0]; - break; - case TGSI_PROPERTY_GS_OUTPUT_PRIM: - shader->gs_output_prim = sel->info.properties[i].data[0]; - break; - case TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES: - shader->gs_max_out_vertices = sel->info.properties[i].data[0]; - break; - } - } + shader->gs_input_prim = + sel->info.properties[TGSI_PROPERTY_GS_INPUT_PRIM][0]; + shader->gs_output_prim = + sel->info.properties[TGSI_PROPERTY_GS_OUTPUT_PRIM][0]; + shader->gs_max_out_vertices = + sel->info.properties[TGSI_PROPERTY_GS_MAX_OUTPUT_VERTICES][0]; break; - } - case TGSI_PROCESSOR_FRAGMENT: { - int i; - + case TGSI_PROCESSOR_FRAGMENT: si_shader_ctx.radeon_bld.load_input = declare_input_fs; bld_base->emit_epilogue = si_llvm_emit_fs_epilogue; - for (i = 0; i < sel->info.num_properties; i++) { - switch (sel->info.properties[i].name) { - case TGSI_PROPERTY_FS_DEPTH_LAYOUT: - switch (sel->info.properties[i].data[0]) { - case TGSI_FS_DEPTH_LAYOUT_GREATER: - shader->db_shader_control |= - S_02880C_CONSERVATIVE_Z_EXPORT(V_02880C_EXPORT_GREATER_THAN_Z); - break; - case TGSI_FS_DEPTH_LAYOUT_LESS: - shader->db_shader_control |= - S_02880C_CONSERVATIVE_Z_EXPORT(V_02880C_EXPORT_LESS_THAN_Z); - break; - } - break; - } + switch (sel->info.properties[TGSI_PROPERTY_FS_DEPTH_LAYOUT][0]) { + case TGSI_FS_DEPTH_LAYOUT_GREATER: + shader->db_shader_control |= + S_02880C_CONSERVATIVE_Z_EXPORT(V_02880C_EXPORT_GREATER_THAN_Z); + break; + case TGSI_FS_DEPTH_LAYOUT_LESS: + shader->db_shader_control |= + S_02880C_CONSERVATIVE_Z_EXPORT(V_02880C_EXPORT_LESS_THAN_Z); + break; } break; - } default: assert(!"Unsupported shader type"); return -1;