[Mesa-dev] Mesa (master): st/mesa: inline if(1) conditional
Jose Fonseca
jfonseca at vmware.com
Wed Jan 25 05:39:32 PST 2012
Marek,
I'm seeing the following assertion failure
src/mesa/state_tracker/st_glsl_to_tgsi.cpp:4032:src_register: Assertion `t->inputMapping[index] < (sizeof(t->inputs)/sizeof(*(t->inputs)))' failed.
all over the place (conform, glean, piglit) since the commit below. For example, doing
/var/lib/hudson/tools/linux64/piglit/bin/pbo-drawpixels -auto
w/ llvmpipe.
Jose
----- Original Message -----
> Module: Mesa
> Branch: master
> Commit: 697b9945fb0f55428b06821f98fd8621372f81ad
> URL:
> http://cgit.freedesktop.org/mesa/mesa/commit/?id=697b9945fb0f55428b06821f98fd8621372f81ad
>
> Author: Marek Olšák <maraeo at gmail.com>
> Date: Mon Jan 23 13:28:07 2012 +0100
>
> st/mesa: inline if(1) conditional
>
> v2: fix typo
>
> ---
>
> src/mesa/state_tracker/st_program.c | 434
> +++++++++++++++++------------------
> 1 files changed, 215 insertions(+), 219 deletions(-)
>
> diff --git a/src/mesa/state_tracker/st_program.c
> b/src/mesa/state_tracker/st_program.c
> index 978de88..cebe390 100644
> --- a/src/mesa/state_tracker/st_program.c
> +++ b/src/mesa/state_tracker/st_program.c
> @@ -473,6 +473,23 @@ st_translate_fragment_program(struct st_context
> *st,
> struct st_fp_variant *variant = CALLOC_STRUCT(st_fp_variant);
> GLboolean deleteFP = GL_FALSE;
>
> + GLuint outputMapping[FRAG_RESULT_MAX];
> + GLuint inputMapping[FRAG_ATTRIB_MAX];
> + GLuint interpMode[PIPE_MAX_SHADER_INPUTS]; /* XXX size? */
> + GLuint attr;
> + const GLbitfield64 inputsRead = stfp->Base.Base.InputsRead;
> + struct ureg_program *ureg;
> +
> + GLboolean write_all = GL_FALSE;
> +
> + ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS];
> + ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
> + uint fs_num_inputs = 0;
> +
> + ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
> + ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
> + uint fs_num_outputs = 0;
> +
> if (!variant)
> return NULL;
>
> @@ -508,243 +525,222 @@ st_translate_fragment_program(struct
> st_context *st,
> }
> #endif
>
> - /* XXX this will be cleaned up in the following commit */
> - if (1) {
> - /* need to translate Mesa instructions to TGSI now */
> - GLuint outputMapping[FRAG_RESULT_MAX];
> - GLuint inputMapping[FRAG_ATTRIB_MAX];
> - GLuint interpMode[PIPE_MAX_SHADER_INPUTS]; /* XXX size? */
> - GLuint attr;
> - const GLbitfield64 inputsRead = stfp->Base.Base.InputsRead;
> - struct ureg_program *ureg;
> -
> - GLboolean write_all = GL_FALSE;
> -
> - ubyte input_semantic_name[PIPE_MAX_SHADER_INPUTS];
> - ubyte input_semantic_index[PIPE_MAX_SHADER_INPUTS];
> - uint fs_num_inputs = 0;
> -
> - ubyte fs_output_semantic_name[PIPE_MAX_SHADER_OUTPUTS];
> - ubyte fs_output_semantic_index[PIPE_MAX_SHADER_OUTPUTS];
> - uint fs_num_outputs = 0;
> -
> - if (!stfp->glsl_to_tgsi)
> - _mesa_remove_output_reads(&stfp->Base.Base,
> PROGRAM_OUTPUT);
> + if (!stfp->glsl_to_tgsi)
> + _mesa_remove_output_reads(&stfp->Base.Base, PROGRAM_OUTPUT);
>
> - /*
> - * Convert Mesa program inputs to TGSI input register
> semantics.
> - */
> - for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) {
> - if ((inputsRead & BITFIELD64_BIT(attr)) != 0) {
> - const GLuint slot = fs_num_inputs++;
> + /*
> + * Convert Mesa program inputs to TGSI input register semantics.
> + */
> + for (attr = 0; attr < FRAG_ATTRIB_MAX; attr++) {
> + if ((inputsRead & BITFIELD64_BIT(attr)) != 0) {
> + const GLuint slot = fs_num_inputs++;
>
> - inputMapping[attr] = slot;
> + inputMapping[attr] = slot;
>
> - switch (attr) {
> - case FRAG_ATTRIB_WPOS:
> - input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
> - input_semantic_index[slot] = 0;
> + switch (attr) {
> + case FRAG_ATTRIB_WPOS:
> + input_semantic_name[slot] = TGSI_SEMANTIC_POSITION;
> + input_semantic_index[slot] = 0;
> + interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
> + break;
> + case FRAG_ATTRIB_COL0:
> + input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
> + input_semantic_index[slot] = 0;
> + interpMode[slot] =
> st_translate_interp(stfp->Base.InterpQualifier[attr],
> + TRUE);
> + break;
> + case FRAG_ATTRIB_COL1:
> + input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
> + input_semantic_index[slot] = 1;
> + interpMode[slot] =
> st_translate_interp(stfp->Base.InterpQualifier[attr],
> + TRUE);
> + break;
> + case FRAG_ATTRIB_FOGC:
> + input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
> + input_semantic_index[slot] = 0;
> + interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
> + break;
> + case FRAG_ATTRIB_FACE:
> + input_semantic_name[slot] = TGSI_SEMANTIC_FACE;
> + input_semantic_index[slot] = 0;
> + interpMode[slot] = TGSI_INTERPOLATE_CONSTANT;
> + break;
> + case FRAG_ATTRIB_CLIP_DIST0:
> + input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST;
> + input_semantic_index[slot] = 0;
> + interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
> + break;
> + case FRAG_ATTRIB_CLIP_DIST1:
> + input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST;
> + input_semantic_index[slot] = 1;
> + interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
> + break;
> + /* In most cases, there is nothing special about these
> + * inputs, so adopt a convention to use the generic
> + * semantic name and the mesa FRAG_ATTRIB_ number as the
> + * index.
> + *
> + * All that is required is that the vertex shader labels
> + * its own outputs similarly, and that the vertex shader
> + * generates at least every output required by the
> + * fragment shader plus fixed-function hardware (such as
> + * BFC).
> + *
> + * There is no requirement that semantic indexes start
> at
> + * zero or be restricted to a particular range -- nobody
> + * should be building tables based on semantic index.
> + */
> + case FRAG_ATTRIB_PNTC:
> + case FRAG_ATTRIB_TEX0:
> + case FRAG_ATTRIB_TEX1:
> + case FRAG_ATTRIB_TEX2:
> + case FRAG_ATTRIB_TEX3:
> + case FRAG_ATTRIB_TEX4:
> + case FRAG_ATTRIB_TEX5:
> + case FRAG_ATTRIB_TEX6:
> + case FRAG_ATTRIB_TEX7:
> + case FRAG_ATTRIB_VAR0:
> + default:
> + /* Actually, let's try and zero-base this just for
> + * readability of the generated TGSI.
> + */
> + assert(attr >= FRAG_ATTRIB_TEX0);
> + input_semantic_index[slot] = (attr - FRAG_ATTRIB_TEX0);
> + input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
> + if (attr == FRAG_ATTRIB_PNTC)
> interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
> - break;
> - case FRAG_ATTRIB_COL0:
> - input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
> - input_semantic_index[slot] = 0;
> - interpMode[slot] =
> st_translate_interp(stfp->Base.InterpQualifier[attr],
> - TRUE);
> - break;
> - case FRAG_ATTRIB_COL1:
> - input_semantic_name[slot] = TGSI_SEMANTIC_COLOR;
> - input_semantic_index[slot] = 1;
> + else
> interpMode[slot] =
> st_translate_interp(stfp->Base.InterpQualifier[attr],
> - TRUE);
> - break;
> - case FRAG_ATTRIB_FOGC:
> - input_semantic_name[slot] = TGSI_SEMANTIC_FOG;
> - input_semantic_index[slot] = 0;
> - interpMode[slot] = TGSI_INTERPOLATE_PERSPECTIVE;
> - break;
> - case FRAG_ATTRIB_FACE:
> - input_semantic_name[slot] = TGSI_SEMANTIC_FACE;
> - input_semantic_index[slot] = 0;
> - interpMode[slot] = TGSI_INTERPOLATE_CONSTANT;
> - break;
> - case FRAG_ATTRIB_CLIP_DIST0:
> - input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST;
> - input_semantic_index[slot] = 0;
> - interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
> - break;
> - case FRAG_ATTRIB_CLIP_DIST1:
> - input_semantic_name[slot] = TGSI_SEMANTIC_CLIPDIST;
> - input_semantic_index[slot] = 1;
> - interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
> - break;
> - /* In most cases, there is nothing special about
> these
> - * inputs, so adopt a convention to use the generic
> - * semantic name and the mesa FRAG_ATTRIB_ number as
> the
> - * index.
> - *
> - * All that is required is that the vertex shader
> labels
> - * its own outputs similarly, and that the vertex
> shader
> - * generates at least every output required by the
> - * fragment shader plus fixed-function hardware (such
> as
> - * BFC).
> - *
> - * There is no requirement that semantic indexes
> start at
> - * zero or be restricted to a particular range --
> nobody
> - * should be building tables based on semantic index.
> - */
> - case FRAG_ATTRIB_PNTC:
> - case FRAG_ATTRIB_TEX0:
> - case FRAG_ATTRIB_TEX1:
> - case FRAG_ATTRIB_TEX2:
> - case FRAG_ATTRIB_TEX3:
> - case FRAG_ATTRIB_TEX4:
> - case FRAG_ATTRIB_TEX5:
> - case FRAG_ATTRIB_TEX6:
> - case FRAG_ATTRIB_TEX7:
> - case FRAG_ATTRIB_VAR0:
> - default:
> - /* Actually, let's try and zero-base this just for
> - * readability of the generated TGSI.
> - */
> - assert(attr >= FRAG_ATTRIB_TEX0);
> - input_semantic_index[slot] = (attr -
> FRAG_ATTRIB_TEX0);
> - input_semantic_name[slot] = TGSI_SEMANTIC_GENERIC;
> - if (attr == FRAG_ATTRIB_PNTC)
> - interpMode[slot] = TGSI_INTERPOLATE_LINEAR;
> - else
> - interpMode[slot] =
> st_translate_interp(stfp->Base.InterpQualifier[attr],
> - FALSE);
> - break;
> - }
> - }
> - else {
> - inputMapping[attr] = -1;
> + FALSE);
> + break;
> }
> }
> -
> - /*
> - * Semantics and mapping for outputs
> - */
> - {
> - uint numColors = 0;
> - GLbitfield64 outputsWritten =
> stfp->Base.Base.OutputsWritten;
> -
> - /* if z is written, emit that first */
> - if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) {
> - fs_output_semantic_name[fs_num_outputs] =
> TGSI_SEMANTIC_POSITION;
> - fs_output_semantic_index[fs_num_outputs] = 0;
> - outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs;
> - fs_num_outputs++;
> - outputsWritten &= ~(1 << FRAG_RESULT_DEPTH);
> - }
> -
> - if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_STENCIL)) {
> - fs_output_semantic_name[fs_num_outputs] =
> TGSI_SEMANTIC_STENCIL;
> - fs_output_semantic_index[fs_num_outputs] = 0;
> - outputMapping[FRAG_RESULT_STENCIL] = fs_num_outputs;
> - fs_num_outputs++;
> - outputsWritten &= ~(1 << FRAG_RESULT_STENCIL);
> - }
> -
> - /* handle remaning outputs (color) */
> - for (attr = 0; attr < FRAG_RESULT_MAX; attr++) {
> - if (outputsWritten & BITFIELD64_BIT(attr)) {
> - switch (attr) {
> - case FRAG_RESULT_DEPTH:
> - case FRAG_RESULT_STENCIL:
> - /* handled above */
> - assert(0);
> - break;
> - case FRAG_RESULT_COLOR:
> - write_all = GL_TRUE; /* fallthrough */
> - default:
> - assert(attr == FRAG_RESULT_COLOR ||
> - (FRAG_RESULT_DATA0 <= attr && attr <
> FRAG_RESULT_MAX));
> - fs_output_semantic_name[fs_num_outputs] =
> TGSI_SEMANTIC_COLOR;
> - fs_output_semantic_index[fs_num_outputs] =
> numColors;
> - outputMapping[attr] = fs_num_outputs;
> - numColors++;
> - break;
> - }
> -
> - fs_num_outputs++;
> - }
> - }
> + else {
> + inputMapping[attr] = -1;
> }
> + }
>
> - ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
> - if (ureg == NULL) {
> - FREE(variant);
> - return NULL;
> + /*
> + * Semantics and mapping for outputs
> + */
> + {
> + uint numColors = 0;
> + GLbitfield64 outputsWritten = stfp->Base.Base.OutputsWritten;
> +
> + /* if z is written, emit that first */
> + if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_DEPTH)) {
> + fs_output_semantic_name[fs_num_outputs] =
> TGSI_SEMANTIC_POSITION;
> + fs_output_semantic_index[fs_num_outputs] = 0;
> + outputMapping[FRAG_RESULT_DEPTH] = fs_num_outputs;
> + fs_num_outputs++;
> + outputsWritten &= ~(1 << FRAG_RESULT_DEPTH);
> }
>
> - if (ST_DEBUG & DEBUG_MESA) {
> - _mesa_print_program(&stfp->Base.Base);
> - _mesa_print_program_parameters(st->ctx, &stfp->Base.Base);
> - debug_printf("\n");
> + if (outputsWritten & BITFIELD64_BIT(FRAG_RESULT_STENCIL)) {
> + fs_output_semantic_name[fs_num_outputs] =
> TGSI_SEMANTIC_STENCIL;
> + fs_output_semantic_index[fs_num_outputs] = 0;
> + outputMapping[FRAG_RESULT_STENCIL] = fs_num_outputs;
> + fs_num_outputs++;
> + outputsWritten &= ~(1 << FRAG_RESULT_STENCIL);
> }
> - if (write_all == GL_TRUE)
> - ureg_property_fs_color0_writes_all_cbufs(ureg, 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);
> - break;
> - case FRAG_DEPTH_LAYOUT_GREATER:
> - ureg_property_fs_depth_layout(ureg,
> TGSI_FS_DEPTH_LAYOUT_GREATER);
> - break;
> - case FRAG_DEPTH_LAYOUT_LESS:
> - ureg_property_fs_depth_layout(ureg,
> TGSI_FS_DEPTH_LAYOUT_LESS);
> - break;
> - case FRAG_DEPTH_LAYOUT_UNCHANGED:
> - ureg_property_fs_depth_layout(ureg,
> TGSI_FS_DEPTH_LAYOUT_UNCHANGED);
> - break;
> - default:
> - assert(0);
> + /* handle remaining outputs (color) */
> + for (attr = 0; attr < FRAG_RESULT_MAX; attr++) {
> + if (outputsWritten & BITFIELD64_BIT(attr)) {
> + switch (attr) {
> + case FRAG_RESULT_DEPTH:
> + case FRAG_RESULT_STENCIL:
> + /* handled above */
> + assert(0);
> + break;
> + case FRAG_RESULT_COLOR:
> + write_all = GL_TRUE; /* fallthrough */
> + default:
> + assert(attr == FRAG_RESULT_COLOR ||
> + (FRAG_RESULT_DATA0 <= attr && attr <
> FRAG_RESULT_MAX));
> + fs_output_semantic_name[fs_num_outputs] =
> TGSI_SEMANTIC_COLOR;
> + fs_output_semantic_index[fs_num_outputs] = numColors;
> + outputMapping[attr] = fs_num_outputs;
> + numColors++;
> + break;
> + }
> +
> + fs_num_outputs++;
> }
> }
> + }
>
> - if (stfp->glsl_to_tgsi)
> - st_translate_program(st->ctx,
> - TGSI_PROCESSOR_FRAGMENT,
> - ureg,
> - stfp->glsl_to_tgsi,
> - &stfp->Base.Base,
> - /* inputs */
> - fs_num_inputs,
> - inputMapping,
> - input_semantic_name,
> - input_semantic_index,
> - interpMode,
> - /* outputs */
> - fs_num_outputs,
> - outputMapping,
> - fs_output_semantic_name,
> - fs_output_semantic_index, FALSE,
> - key->clamp_color );
> - else
> - st_translate_mesa_program(st->ctx,
> - TGSI_PROCESSOR_FRAGMENT,
> - ureg,
> - &stfp->Base.Base,
> - /* inputs */
> - fs_num_inputs,
> - inputMapping,
> - input_semantic_name,
> - input_semantic_index,
> - interpMode,
> - /* outputs */
> - fs_num_outputs,
> - outputMapping,
> - fs_output_semantic_name,
> - fs_output_semantic_index, FALSE,
> - key->clamp_color);
> + ureg = ureg_create( TGSI_PROCESSOR_FRAGMENT );
> + if (ureg == NULL) {
> + FREE(variant);
> + return NULL;
> + }
>
> - variant->tgsi.tokens = ureg_get_tokens( ureg, NULL );
> - ureg_destroy( ureg );
> + if (ST_DEBUG & DEBUG_MESA) {
> + _mesa_print_program(&stfp->Base.Base);
> + _mesa_print_program_parameters(st->ctx, &stfp->Base.Base);
> + debug_printf("\n");
> }
> + if (write_all == GL_TRUE)
> + ureg_property_fs_color0_writes_all_cbufs(ureg, 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);
> + break;
> + case FRAG_DEPTH_LAYOUT_GREATER:
> + ureg_property_fs_depth_layout(ureg,
> TGSI_FS_DEPTH_LAYOUT_GREATER);
> + break;
> + case FRAG_DEPTH_LAYOUT_LESS:
> + ureg_property_fs_depth_layout(ureg,
> TGSI_FS_DEPTH_LAYOUT_LESS);
> + break;
> + case FRAG_DEPTH_LAYOUT_UNCHANGED:
> + ureg_property_fs_depth_layout(ureg,
> TGSI_FS_DEPTH_LAYOUT_UNCHANGED);
> + break;
> + default:
> + assert(0);
> + }
> + }
> +
> + if (stfp->glsl_to_tgsi)
> + st_translate_program(st->ctx,
> + TGSI_PROCESSOR_FRAGMENT,
> + ureg,
> + stfp->glsl_to_tgsi,
> + &stfp->Base.Base,
> + /* inputs */
> + fs_num_inputs,
> + inputMapping,
> + input_semantic_name,
> + input_semantic_index,
> + interpMode,
> + /* outputs */
> + fs_num_outputs,
> + outputMapping,
> + fs_output_semantic_name,
> + fs_output_semantic_index, FALSE,
> + key->clamp_color );
> + else
> + st_translate_mesa_program(st->ctx,
> + TGSI_PROCESSOR_FRAGMENT,
> + ureg,
> + &stfp->Base.Base,
> + /* inputs */
> + fs_num_inputs,
> + inputMapping,
> + input_semantic_name,
> + input_semantic_index,
> + interpMode,
> + /* outputs */
> + fs_num_outputs,
> + outputMapping,
> + fs_output_semantic_name,
> + fs_output_semantic_index, FALSE,
> + key->clamp_color);
> +
> + variant->tgsi.tokens = ureg_get_tokens( ureg, NULL );
> + ureg_destroy( ureg );
>
> /* fill in variant */
> variant->driver_shader = pipe->create_fs_state(pipe,
> &variant->tgsi);
>
> _______________________________________________
> mesa-commit mailing list
> mesa-commit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-commit
>
More information about the mesa-dev
mailing list