unsigned tgsi_build_full_declaration( const struct tgsi_full_declaration *full_decl, struct tgsi_token *tokens, struct tgsi_header *header, unsigned maxsize ) { unsigned size = 0; struct tgsi_declaration *declaration; struct tgsi_declaration_range *dr; if( maxsize <= size ) return 0; declaration = (struct tgsi_declaration *) &tokens[size]; size++; *declaration = tgsi_build_declaration( full_decl->Declaration.File, full_decl->Declaration.UsageMask, full_decl->Declaration.Interpolate, full_decl->Declaration.Dimension, full_decl->Declaration.Semantic, full_decl->Declaration.Invariant, full_decl->Declaration.Local, full_decl->Declaration.Array, header ); if (maxsize <= size) return 0; dr = (struct tgsi_declaration_range *) &tokens[size]; size++; *dr = tgsi_build_declaration_range( full_decl->Range.First, full_decl->Range.Last, declaration, header ); if (full_decl->Declaration.Dimension) { struct tgsi_declaration_dimension *dd; if (maxsize <= size) { return 0; } dd = (struct tgsi_declaration_dimension *)&tokens[size]; size++; *dd = tgsi_build_declaration_dimension(full_decl->Dim.Index2D, declaration, header); } if (full_decl->Declaration.Interpolate) { struct tgsi_declaration_interp *di; if (maxsize <= size) { return 0; } di = (struct tgsi_declaration_interp *)&tokens[size]; size++; *di = tgsi_build_declaration_interp(full_decl->Interp.Interpolate, full_decl->Interp.Location, full_decl->Interp.CylindricalWrap, declaration, header); } if( full_decl->Declaration.Semantic ) { struct tgsi_declaration_semantic *ds; if( maxsize <= size ) return 0; ds = (struct tgsi_declaration_semantic *) &tokens[size]; size++; *ds = tgsi_build_declaration_semantic( full_decl->Semantic.Name, full_decl->Semantic.Index, declaration, header ); } if (full_decl->Declaration.File == TGSI_FILE_RESOURCE) { struct tgsi_declaration_resource *dr; if (maxsize <= size) { return 0; } dr = (struct tgsi_declaration_resource *)&tokens[size]; size++; *dr = tgsi_build_declaration_resource(full_decl->Resource.Resource, full_decl->Resource.Raw, full_decl->Resource.Writable, declaration, header); } if (full_decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) { struct tgsi_declaration_sampler_view *dsv; if (maxsize <= size) { return 0; } dsv = (struct tgsi_declaration_sampler_view *)&tokens[size]; size++; *dsv = tgsi_build_declaration_sampler_view( full_decl->SamplerView.Resource, full_decl->SamplerView.ReturnTypeX, full_decl->SamplerView.ReturnTypeY, full_decl->SamplerView.ReturnTypeZ, full_decl->SamplerView.ReturnTypeW, declaration, header); } if (full_decl->Declaration.Array) { struct tgsi_declaration_array *da; if (maxsize <= size) { return 0; } da = (struct tgsi_declaration_array *)&tokens[size]; size++; *da = tgsi_build_declaration_array( full_decl->Array.ArrayID, declaration, header); } return size; }
unsigned tgsi_build_full_declaration( const struct tgsi_full_declaration *full_decl, struct tgsi_token *tokens, struct tgsi_header *header, unsigned maxsize ) { unsigned size = 0; struct tgsi_declaration *declaration; struct tgsi_declaration_range *dr; if( maxsize <= size ) return 0; declaration = (struct tgsi_declaration *) &tokens[size]; size++; *declaration = tgsi_build_declaration( full_decl->Declaration.File, full_decl->Declaration.UsageMask, full_decl->Declaration.Interpolate, full_decl->Declaration.Dimension, full_decl->Declaration.Semantic, full_decl->Declaration.Invariant, full_decl->Declaration.Local, header ); if (maxsize <= size) return 0; dr = (struct tgsi_declaration_range *) &tokens[size]; size++; *dr = tgsi_build_declaration_range( full_decl->Range.First, full_decl->Range.Last, declaration, header ); if (full_decl->Declaration.Dimension) { struct tgsi_declaration_dimension *dd; if (maxsize <= size) { return 0; } dd = (struct tgsi_declaration_dimension *)&tokens[size]; size++; *dd = tgsi_build_declaration_dimension(full_decl->Dim.Index2D, declaration, header); } if (full_decl->Declaration.Interpolate) { struct tgsi_declaration_interp *di; if (maxsize <= size) { return 0; } di = (struct tgsi_declaration_interp *)&tokens[size]; size++; *di = tgsi_build_declaration_interp(full_decl->Interp.Interpolate, full_decl->Interp.Centroid, full_decl->Interp.CylindricalWrap, declaration, header); } if( full_decl->Declaration.Semantic ) { struct tgsi_declaration_semantic *ds; if( maxsize <= size ) return 0; ds = (struct tgsi_declaration_semantic *) &tokens[size]; size++; *ds = tgsi_build_declaration_semantic( full_decl->Semantic.Name, full_decl->Semantic.Index, declaration, header ); } if (full_decl->Declaration.File == TGSI_FILE_IMMEDIATE_ARRAY) { unsigned i, j; union tgsi_immediate_data *data; for (i = 0; i <= dr->Last; ++i) { for (j = 0; j < 4; ++j) { unsigned idx = i*4 + j; if (maxsize <= size) return 0; data = (union tgsi_immediate_data *) &tokens[size]; ++size; *data = full_decl->ImmediateData.u[idx]; declaration_grow( declaration, header ); } } } if (full_decl->Declaration.File == TGSI_FILE_RESOURCE) { struct tgsi_declaration_resource *dr; if (maxsize <= size) { return 0; } dr = (struct tgsi_declaration_resource *)&tokens[size]; size++; *dr = tgsi_build_declaration_resource(full_decl->Resource.Resource, full_decl->Resource.Raw, full_decl->Resource.Writable, declaration, header); } if (full_decl->Declaration.File == TGSI_FILE_SAMPLER_VIEW) { struct tgsi_declaration_sampler_view *dsv; if (maxsize <= size) { return 0; } dsv = (struct tgsi_declaration_sampler_view *)&tokens[size]; size++; *dsv = tgsi_build_declaration_sampler_view( full_decl->SamplerView.Resource, full_decl->SamplerView.ReturnTypeX, full_decl->SamplerView.ReturnTypeY, full_decl->SamplerView.ReturnTypeZ, full_decl->SamplerView.ReturnTypeW, declaration, header); } return size; }