diff options
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/swrast/s_arbshader.c | 124 |
1 files changed, 60 insertions, 64 deletions
diff --git a/src/mesa/swrast/s_arbshader.c b/src/mesa/swrast/s_arbshader.c index 9cd96c5a366..88a9374cd33 100644 --- a/src/mesa/swrast/s_arbshader.c +++ b/src/mesa/swrast/s_arbshader.c @@ -35,75 +35,71 @@ #include "slang_utility.h" #include "slang_link.h" -void _swrast_exec_arbshader (GLcontext *ctx, struct sw_span *span) +void +_swrast_exec_arbshader(GLcontext *ctx, struct sw_span *span) { - struct gl2_program_intf **pro; - GLuint i; + struct gl2_program_intf **pro; + GLuint i; - if (!ctx->ShaderObjects._FragmentShaderPresent) - return; - pro = ctx->ShaderObjects.CurrentProgram; - if (!ctx->ShaderObjects._VertexShaderPresent) - (**pro).UpdateFixedUniforms (pro); + if (!ctx->ShaderObjects._FragmentShaderPresent) + return; - for (i = span->start; i < span->end; i++) - { - /* only run shader on active fragments */ - if (span->array->mask[i]) { - GLfloat vec[4]; - GLuint j; - GLboolean discard; + pro = ctx->ShaderObjects.CurrentProgram; + if (!ctx->ShaderObjects._VertexShaderPresent) + (**pro).UpdateFixedUniforms(pro); - vec[0] = (GLfloat) span->x + i; - vec[1] = (GLfloat) span->y; - vec[2] = (GLfloat) span->array->z[i] / ctx->DrawBuffer->_DepthMaxF; - vec[3] = span->w + span->dwdx * i; - (**pro).UpdateFixedVarying (pro, SLANG_FRAGMENT_FIXED_FRAGCOORD, vec, 0, - 4 * sizeof (GLfloat), GL_TRUE); - vec[0] = CHAN_TO_FLOAT(span->array->rgba[i][RCOMP]); - vec[1] = CHAN_TO_FLOAT(span->array->rgba[i][GCOMP]); - vec[2] = CHAN_TO_FLOAT(span->array->rgba[i][BCOMP]); - vec[3] = CHAN_TO_FLOAT(span->array->rgba[i][ACOMP]); - (**pro).UpdateFixedVarying (pro, SLANG_FRAGMENT_FIXED_COLOR, vec, 0, 4 * sizeof (GLfloat), - GL_TRUE); - for (j = 0; j < ctx->Const.MaxTextureCoordUnits; j++) - { - vec[0] = span->array->texcoords[j][i][0]; - vec[1] = span->array->texcoords[j][i][1]; - vec[2] = span->array->texcoords[j][i][2]; - vec[3] = span->array->texcoords[j][i][3]; - (**pro).UpdateFixedVarying (pro, SLANG_FRAGMENT_FIXED_TEXCOORD, vec, j, - 4 * sizeof (GLfloat), GL_TRUE); - } - for (j = 0; j < MAX_VARYING_VECTORS; j++) - { - GLuint k; + for (i = span->start; i < span->end; i++) { + /* only run shader on active fragments */ + if (span->array->mask[i]) { + GLfloat vec[4]; + GLuint j; + GLboolean discard; - for (k = 0; k < VARYINGS_PER_VECTOR; k++) - { - (**pro).UpdateVarying (pro, j * VARYINGS_PER_VECTOR + k, - &span->array->varying[i][j][k], GL_FALSE); - } - } + vec[0] = (GLfloat) span->x + i; + vec[1] = (GLfloat) span->y; + vec[2] = (GLfloat) span->array->z[i] / ctx->DrawBuffer->_DepthMaxF; + vec[3] = span->w + span->dwdx * i; + (**pro).UpdateFixedVarying(pro, SLANG_FRAGMENT_FIXED_FRAGCOORD, vec, + 0, 4 * sizeof(GLfloat), GL_TRUE); + vec[0] = CHAN_TO_FLOAT(span->array->rgba[i][RCOMP]); + vec[1] = CHAN_TO_FLOAT(span->array->rgba[i][GCOMP]); + vec[2] = CHAN_TO_FLOAT(span->array->rgba[i][BCOMP]); + vec[3] = CHAN_TO_FLOAT(span->array->rgba[i][ACOMP]); + (**pro).UpdateFixedVarying(pro, SLANG_FRAGMENT_FIXED_COLOR, vec, 0, + 4 * sizeof(GLfloat), GL_TRUE); + for (j = 0; j < ctx->Const.MaxTextureCoordUnits; j++) { + vec[0] = span->array->texcoords[j][i][0]; + vec[1] = span->array->texcoords[j][i][1]; + vec[2] = span->array->texcoords[j][i][2]; + vec[3] = span->array->texcoords[j][i][3]; + (**pro).UpdateFixedVarying(pro, SLANG_FRAGMENT_FIXED_TEXCOORD, + vec, j, 4 * sizeof(GLfloat), GL_TRUE); + } + for (j = 0; j < MAX_VARYING_VECTORS; j++) { + GLuint k; - _slang_exec_fragment_shader (pro); + for (k = 0; k < VARYINGS_PER_VECTOR; k++) { + (**pro).UpdateVarying(pro, j * VARYINGS_PER_VECTOR + k, + &span->array->varying[i][j][k], + GL_FALSE); + } + } - _slang_fetch_discard (pro, &discard); - if (discard) - { - span->array->mask[i] = GL_FALSE; - span->writeAll = GL_FALSE; - } - else - { - (**pro).UpdateFixedVarying (pro, SLANG_FRAGMENT_FIXED_FRAGCOLOR, vec, 0, - 4 * sizeof (GLfloat), GL_FALSE); - UNCLAMPED_FLOAT_TO_CHAN(span->array->rgba[i][RCOMP], vec[0]); - UNCLAMPED_FLOAT_TO_CHAN(span->array->rgba[i][GCOMP], vec[1]); - UNCLAMPED_FLOAT_TO_CHAN(span->array->rgba[i][BCOMP], vec[2]); - UNCLAMPED_FLOAT_TO_CHAN(span->array->rgba[i][ACOMP], vec[3]); - } - } - } -} + _slang_exec_fragment_shader(pro); + _slang_fetch_discard(pro, &discard); + if (discard) { + span->array->mask[i] = GL_FALSE; + span->writeAll = GL_FALSE; + } + else { + (**pro).UpdateFixedVarying(pro, SLANG_FRAGMENT_FIXED_FRAGCOLOR, + vec, 0, 4 * sizeof(GLfloat), GL_FALSE); + UNCLAMPED_FLOAT_TO_CHAN(span->array->rgba[i][RCOMP], vec[0]); + UNCLAMPED_FLOAT_TO_CHAN(span->array->rgba[i][GCOMP], vec[1]); + UNCLAMPED_FLOAT_TO_CHAN(span->array->rgba[i][BCOMP], vec[2]); + UNCLAMPED_FLOAT_TO_CHAN(span->array->rgba[i][ACOMP], vec[3]); + } + } + } +} |