X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fgallium%2Fauxiliary%2Ftgsi%2Ftgsi_ureg.c;h=55ed7fc62b44badeaa9950a0a39e85ec63f64c1e;hb=c9af7701d1be791752fafcbe19169851bcdf1336;hp=393e01500173bd83a630d1956148888b56b98216;hpb=ec478cf9c31c3775a21cd7b5b4b5cdd9263bde9e;p=mesa.git diff --git a/src/gallium/auxiliary/tgsi/tgsi_ureg.c b/src/gallium/auxiliary/tgsi/tgsi_ureg.c index 393e0150017..55ed7fc62b4 100644 --- a/src/gallium/auxiliary/tgsi/tgsi_ureg.c +++ b/src/gallium/auxiliary/tgsi/tgsi_ureg.c @@ -1,8 +1,8 @@ /************************************************************************** - * + * * Copyright 2009-2010 VMware, Inc. * All Rights Reserved. - * + * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including @@ -10,11 +10,11 @@ * distribute, sub license, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: - * + * * The above copyright notice and this permission notice (including the * next paragraph) shall be included in all copies or substantial portions * of the Software. - * + * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. @@ -22,7 +22,7 @@ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - * + * **************************************************************************/ @@ -140,6 +140,7 @@ struct ureg_program unsigned first; unsigned last; unsigned array_id; + boolean invariant; } output[UREG_MAX_OUTPUT]; unsigned nr_outputs, nr_output_regs; @@ -170,7 +171,7 @@ struct ureg_program struct { unsigned index; enum tgsi_texture_type target; - unsigned format; + enum pipe_format format; boolean wr; boolean raw; } image[PIPE_MAX_SHADER_IMAGES]; @@ -349,7 +350,7 @@ ureg_DECL_fs_input_cyl_centroid(struct ureg_program *ureg, } -struct ureg_src +struct ureg_src ureg_DECL_vs_input( struct ureg_program *ureg, unsigned index ) { @@ -427,7 +428,8 @@ ureg_DECL_output_layout(struct ureg_program *ureg, unsigned index, unsigned usage_mask, unsigned array_id, - unsigned array_size) + unsigned array_size, + boolean invariant) { unsigned i; @@ -455,6 +457,7 @@ ureg_DECL_output_layout(struct ureg_program *ureg, ureg->output[i].first = index; ureg->output[i].last = index + array_size - 1; ureg->output[i].array_id = array_id; + ureg->output[i].invariant = invariant; ureg->nr_output_regs = MAX2(ureg->nr_output_regs, index + array_size); ureg->nr_outputs++; } @@ -480,11 +483,12 @@ ureg_DECL_output_masked(struct ureg_program *ureg, unsigned array_size) { return ureg_DECL_output_layout(ureg, name, index, 0, - ureg->nr_output_regs, usage_mask, array_id, array_size); + ureg->nr_output_regs, usage_mask, array_id, + array_size, FALSE); } -struct ureg_dst +struct ureg_dst ureg_DECL_output(struct ureg_program *ureg, enum tgsi_semantic name, unsigned index) @@ -718,9 +722,9 @@ struct ureg_src ureg_DECL_sampler( struct ureg_program *ureg, unsigned i; for (i = 0; i < ureg->nr_samplers; i++) - if (ureg->sampler[i].Index == nr) + if (ureg->sampler[i].Index == (int)nr) return ureg->sampler[i]; - + if (i < PIPE_MAX_SAMPLERS) { ureg->sampler[i] = ureg_src_register( TGSI_FILE_SAMPLER, nr ); ureg->nr_samplers++; @@ -773,7 +777,7 @@ struct ureg_src ureg_DECL_image(struct ureg_program *ureg, unsigned index, enum tgsi_texture_type target, - unsigned format, + enum pipe_format format, boolean wr, boolean raw) { @@ -834,7 +838,6 @@ struct ureg_src ureg_DECL_memory(struct ureg_program *ureg, static int match_or_expand_immediate64( const unsigned *v, - int type, unsigned nr, unsigned *v2, unsigned *pnr2, @@ -886,7 +889,7 @@ match_or_expand_immediate( const unsigned *v, if (type == TGSI_IMM_FLOAT64 || type == TGSI_IMM_UINT64 || type == TGSI_IMM_INT64) - return match_or_expand_immediate64(v, type, nr, v2, pnr2, swizzle); + return match_or_expand_immediate64(v, nr, v2, pnr2, swizzle); *swizzle = 0; @@ -1116,7 +1119,7 @@ ureg_emit_src( struct ureg_program *ureg, assert(src.File != TGSI_FILE_NULL); assert(src.File < TGSI_FILE_COUNT); - + out[n].value = 0; out[n].src.File = src.File; out[n].src.SwizzleX = src.SwizzleX; @@ -1170,7 +1173,7 @@ ureg_emit_src( struct ureg_program *ureg, } -void +void ureg_emit_dst( struct ureg_program *ureg, struct ureg_dst dst ) { @@ -1192,7 +1195,7 @@ ureg_emit_dst( struct ureg_program *ureg, out[n].dst.Indirect = dst.Indirect; out[n].dst.Index = dst.Index; n++; - + if (dst.Indirect) { out[n].value = 0; out[n].ind.File = dst.IndirectFile; @@ -1238,7 +1241,7 @@ static void validate( enum tgsi_opcode opcode, unsigned nr_dst, unsigned nr_src ) { -#ifdef DEBUG +#ifndef NDEBUG const struct tgsi_opcode_info *info = tgsi_get_opcode_info( opcode ); assert(info); if (info) { @@ -1261,7 +1264,7 @@ ureg_emit_insn(struct ureg_program *ureg, struct ureg_emit_insn_result result; validate( opcode, num_dst, num_src ); - + out = get_tokens( ureg, DOMAIN_INSN, count ); out[0].insn = tgsi_default_instruction(); out[0].insn.Opcode = opcode; @@ -1356,15 +1359,14 @@ ureg_emit_texture_offset(struct ureg_program *ureg, out[0].value = 0; out[0].insn_texture_offset = *offset; - } void ureg_emit_memory(struct ureg_program *ureg, unsigned extended_token, unsigned qualifier, - unsigned texture, - unsigned format) + enum tgsi_texture_type texture, + enum pipe_format format) { union tgsi_any_token *out, *insn; @@ -1478,8 +1480,8 @@ ureg_memory_insn(struct ureg_program *ureg, const struct ureg_src *src, unsigned nr_src, unsigned qualifier, - unsigned texture, - unsigned format) + enum tgsi_texture_type texture, + enum pipe_format format) { struct ureg_emit_insn_result insn; unsigned i; @@ -1512,7 +1514,8 @@ emit_decl_semantic(struct ureg_program *ureg, unsigned semantic_index, unsigned streams, unsigned usage_mask, - unsigned array_id) + unsigned array_id, + boolean invariant) { union tgsi_any_token *out = get_tokens(ureg, DOMAIN_DECL, array_id ? 4 : 3); @@ -1523,6 +1526,7 @@ emit_decl_semantic(struct ureg_program *ureg, out[0].decl.UsageMask = usage_mask; out[0].decl.Semantic = 1; out[0].decl.Array = array_id != 0; + out[0].decl.Invariant = invariant; out[1].value = 0; out[1].decl_range.First = first; @@ -1719,7 +1723,7 @@ static void emit_decl_image(struct ureg_program *ureg, unsigned index, enum tgsi_texture_type target, - unsigned format, + enum pipe_format format, boolean wr, boolean raw) { @@ -1818,7 +1822,7 @@ static void emit_decls( struct ureg_program *ureg ) unsigned i,j; for (i = 0; i < ARRAY_SIZE(ureg->properties); i++) - if (ureg->properties[i] != ~0) + if (ureg->properties[i] != ~0u) emit_property(ureg, i, ureg->properties[i]); if (ureg->processor == PIPE_SHADER_VERTEX) { @@ -1870,7 +1874,8 @@ static void emit_decls( struct ureg_program *ureg ) ureg->input[i].semantic_index, 0, TGSI_WRITEMASK_XYZW, - ureg->input[i].array_id); + ureg->input[i].array_id, + FALSE); } } else { @@ -1883,7 +1888,7 @@ static void emit_decls( struct ureg_program *ureg ) ureg->input[i].semantic_index + (j - ureg->input[i].first), 0, - TGSI_WRITEMASK_XYZW, 0); + TGSI_WRITEMASK_XYZW, 0, FALSE); } } } @@ -1897,7 +1902,7 @@ static void emit_decls( struct ureg_program *ureg ) ureg->system_value[i].semantic_name, ureg->system_value[i].semantic_index, 0, - TGSI_WRITEMASK_XYZW, 0); + TGSI_WRITEMASK_XYZW, 0, FALSE); } if (ureg->supports_any_inout_decl_range) { @@ -1910,7 +1915,8 @@ static void emit_decls( struct ureg_program *ureg ) ureg->output[i].semantic_index, ureg->output[i].streams, ureg->output[i].usage_mask, - ureg->output[i].array_id); + ureg->output[i].array_id, + ureg->output[i].invariant); } } else { @@ -1923,13 +1929,15 @@ static void emit_decls( struct ureg_program *ureg ) ureg->output[i].semantic_index + (j - ureg->output[i].first), ureg->output[i].streams, - ureg->output[i].usage_mask, 0); + ureg->output[i].usage_mask, + 0, + ureg->output[i].invariant); } } } for (i = 0; i < ureg->nr_samplers; i++) { - emit_decl_range( ureg, + emit_decl_range( ureg, TGSI_FILE_SAMPLER, ureg->sampler[i].Index, 1 ); } @@ -2029,12 +2037,12 @@ static void emit_decls( struct ureg_program *ureg ) static void copy_instructions( struct ureg_program *ureg ) { unsigned nr_tokens = ureg->domain[DOMAIN_INSN].count; - union tgsi_any_token *out = get_tokens( ureg, - DOMAIN_DECL, + union tgsi_any_token *out = get_tokens( ureg, + DOMAIN_DECL, nr_tokens ); - memcpy(out, - ureg->domain[DOMAIN_INSN].tokens, + memcpy(out, + ureg->domain[DOMAIN_INSN].tokens, nr_tokens * sizeof out[0] ); } @@ -2081,7 +2089,7 @@ const struct tgsi_token *ureg_finalize( struct ureg_program *ureg ) emit_decls( ureg ); copy_instructions( ureg ); fixup_header_size( ureg ); - + if (ureg->domain[0].tokens == error_tokens || ureg->domain[1].tokens == error_tokens) { debug_printf("%s: error in generated shader\n", __FUNCTION__); @@ -2092,20 +2100,31 @@ const struct tgsi_token *ureg_finalize( struct ureg_program *ureg ) tokens = &ureg->domain[DOMAIN_DECL].tokens[0].token; if (0) { - debug_printf("%s: emitted shader %d tokens:\n", __FUNCTION__, + debug_printf("%s: emitted shader %d tokens:\n", __FUNCTION__, ureg->domain[DOMAIN_DECL].count); tgsi_dump( tokens, 0 ); } #if DEBUG - if (tokens && !tgsi_sanity_check(tokens)) { + /* tgsi_sanity doesn't seem to return if there are too many constants. */ + bool too_many_constants = false; + for (unsigned i = 0; i < ARRAY_SIZE(ureg->const_decls); i++) { + for (unsigned j = 0; j < ureg->const_decls[i].nr_constant_ranges; j++) { + if (ureg->const_decls[i].constant_range[j].last > 4096) { + too_many_constants = true; + break; + } + } + } + + if (tokens && !too_many_constants && !tgsi_sanity_check(tokens)) { debug_printf("tgsi_ureg.c, sanity check failed on generated tokens:\n"); tgsi_dump(tokens, 0); assert(0); } #endif - + return tokens; } @@ -2149,7 +2168,7 @@ const struct tgsi_token *ureg_get_tokens( struct ureg_program *ureg, tokens = &ureg->domain[DOMAIN_DECL].tokens[0].token; - if (nr_tokens) + if (nr_tokens) *nr_tokens = ureg->domain[DOMAIN_DECL].count; ureg->domain[DOMAIN_DECL].tokens = 0; @@ -2178,7 +2197,7 @@ struct ureg_program * ureg_create_with_screen(enum pipe_shader_type processor, struct pipe_screen *screen) { - int i; + uint i; struct ureg_program *ureg = CALLOC_STRUCT( ureg_program ); if (!ureg) goto no_ureg; @@ -2239,7 +2258,7 @@ void ureg_destroy( struct ureg_program *ureg ) unsigned i; for (i = 0; i < ARRAY_SIZE(ureg->domain); i++) { - if (ureg->domain[i].tokens && + if (ureg->domain[i].tokens && ureg->domain[i].tokens != error_tokens) FREE(ureg->domain[i].tokens); }