st/mesa: add support for POSITION and FACE system values
Reviewed-by: Edward O'Callaghan <eocallaghan@alterapraxis.com Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
parent
c00e534283
commit
8a13ce14fd
|
@ -327,6 +327,11 @@ void st_init_limits(struct pipe_screen *screen,
|
|||
c->Program[MESA_SHADER_FRAGMENT].MaxUniformBlocks;
|
||||
assert(c->MaxCombinedUniformBlocks <= MAX_COMBINED_UNIFORM_BUFFERS);
|
||||
}
|
||||
|
||||
c->GLSLFragCoordIsSysVal =
|
||||
screen->get_param(screen, PIPE_CAP_TGSI_FS_POSITION_IS_SYSVAL);
|
||||
c->GLSLFrontFacingIsSysVal =
|
||||
screen->get_param(screen, PIPE_CAP_TGSI_FS_FACE_IS_INTEGER_SYSVAL);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -4906,10 +4906,11 @@ compile_tgsi_instruction(struct st_translate *t,
|
|||
* a FBO is bound (STATE_FB_WPOS_Y_TRANSFORM).
|
||||
*/
|
||||
static void
|
||||
emit_wpos_adjustment( struct st_translate *t,
|
||||
int wpos_transform_const,
|
||||
boolean invert,
|
||||
GLfloat adjX, GLfloat adjY[2])
|
||||
emit_wpos_adjustment(struct gl_context *ctx,
|
||||
struct st_translate *t,
|
||||
int wpos_transform_const,
|
||||
boolean invert,
|
||||
GLfloat adjX, GLfloat adjY[2])
|
||||
{
|
||||
struct ureg_program *ureg = t->ureg;
|
||||
|
||||
|
@ -4921,7 +4922,11 @@ emit_wpos_adjustment( struct st_translate *t,
|
|||
*/
|
||||
struct ureg_src wpostrans = ureg_DECL_constant(ureg, wpos_transform_const);
|
||||
struct ureg_dst wpos_temp = ureg_DECL_temporary( ureg );
|
||||
struct ureg_src wpos_input = t->inputs[t->inputMapping[VARYING_SLOT_POS]];
|
||||
struct ureg_src *wpos =
|
||||
ctx->Const.GLSLFragCoordIsSysVal ?
|
||||
&t->systemValues[SYSTEM_VALUE_FRAG_COORD] :
|
||||
&t->inputs[t->inputMapping[VARYING_SLOT_POS]];
|
||||
struct ureg_src wpos_input = *wpos;
|
||||
|
||||
/* First, apply the coordinate shift: */
|
||||
if (adjX || adjY[0] || adjY[1]) {
|
||||
|
@ -4972,7 +4977,7 @@ emit_wpos_adjustment( struct st_translate *t,
|
|||
|
||||
/* Use wpos_temp as position input from here on:
|
||||
*/
|
||||
t->inputs[t->inputMapping[VARYING_SLOT_POS]] = ureg_src(wpos_temp);
|
||||
*wpos = ureg_src(wpos_temp);
|
||||
}
|
||||
|
||||
|
||||
|
@ -5081,7 +5086,7 @@ emit_wpos(struct st_context *st,
|
|||
|
||||
/* we invert after adjustment so that we avoid the MOV to temporary,
|
||||
* and reuse the adjustment ADD instead */
|
||||
emit_wpos_adjustment(t, wpos_transform_const, invert, adjX, adjY);
|
||||
emit_wpos_adjustment(st->ctx, t, wpos_transform_const, invert, adjX, adjY);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -5399,6 +5404,11 @@ st_translate_program(
|
|||
}
|
||||
}
|
||||
|
||||
if (procType == TGSI_PROCESSOR_FRAGMENT &&
|
||||
semName == TGSI_SEMANTIC_POSITION)
|
||||
emit_wpos(st_context(ctx), t, proginfo, ureg,
|
||||
program->wpos_transform_const);
|
||||
|
||||
sysInputs &= ~(1 << i);
|
||||
}
|
||||
}
|
||||
|
@ -5685,7 +5695,8 @@ get_mesa_program(struct gl_context *ctx,
|
|||
|
||||
/* This must be done before the uniform storage is associated. */
|
||||
if (shader->Type == GL_FRAGMENT_SHADER &&
|
||||
prog->InputsRead & VARYING_BIT_POS){
|
||||
(prog->InputsRead & VARYING_BIT_POS ||
|
||||
prog->SystemValuesRead & (1 << SYSTEM_VALUE_FRAG_COORD))) {
|
||||
static const gl_state_index wposTransformState[STATE_LENGTH] = {
|
||||
STATE_INTERNAL, STATE_FB_WPOS_Y_TRANSFORM
|
||||
};
|
||||
|
|
|
@ -717,10 +717,11 @@ compile_instruction(
|
|||
* a FBO is bound (STATE_FB_WPOS_Y_TRANSFORM).
|
||||
*/
|
||||
static void
|
||||
emit_wpos_adjustment( struct st_translate *t,
|
||||
const struct gl_program *program,
|
||||
boolean invert,
|
||||
GLfloat adjX, GLfloat adjY[2])
|
||||
emit_wpos_adjustment(struct gl_context *ctx,
|
||||
struct st_translate *t,
|
||||
const struct gl_program *program,
|
||||
boolean invert,
|
||||
GLfloat adjX, GLfloat adjY[2])
|
||||
{
|
||||
struct ureg_program *ureg = t->ureg;
|
||||
|
||||
|
@ -740,7 +741,11 @@ emit_wpos_adjustment( struct st_translate *t,
|
|||
|
||||
struct ureg_src wpostrans = ureg_DECL_constant( ureg, wposTransConst );
|
||||
struct ureg_dst wpos_temp = ureg_DECL_temporary( ureg );
|
||||
struct ureg_src wpos_input = t->inputs[t->inputMapping[VARYING_SLOT_POS]];
|
||||
struct ureg_src *wpos =
|
||||
ctx->Const.GLSLFragCoordIsSysVal ?
|
||||
&t->systemValues[SYSTEM_VALUE_FRAG_COORD] :
|
||||
&t->inputs[t->inputMapping[VARYING_SLOT_POS]];
|
||||
struct ureg_src wpos_input = *wpos;
|
||||
|
||||
/* First, apply the coordinate shift: */
|
||||
if (adjX || adjY[0] || adjY[1]) {
|
||||
|
@ -791,7 +796,7 @@ emit_wpos_adjustment( struct st_translate *t,
|
|||
|
||||
/* Use wpos_temp as position input from here on:
|
||||
*/
|
||||
t->inputs[t->inputMapping[VARYING_SLOT_POS]] = ureg_src(wpos_temp);
|
||||
*wpos = ureg_src(wpos_temp);
|
||||
}
|
||||
|
||||
|
||||
|
@ -899,7 +904,7 @@ emit_wpos(struct st_context *st,
|
|||
|
||||
/* we invert after adjustment so that we avoid the MOV to temporary,
|
||||
* and reuse the adjustment ADD instead */
|
||||
emit_wpos_adjustment(t, program, invert, adjX, adjY);
|
||||
emit_wpos_adjustment(st->ctx, t, program, invert, adjX, adjY);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1077,6 +1082,10 @@ st_translate_mesa_program(
|
|||
}
|
||||
}
|
||||
|
||||
if (procType == TGSI_PROCESSOR_FRAGMENT &&
|
||||
semName == TGSI_SEMANTIC_POSITION)
|
||||
emit_wpos(st_context(ctx), t, program, ureg);
|
||||
|
||||
sysInputs &= ~(1 << i);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -581,8 +581,11 @@ st_translate_fragment_program(struct st_context *st,
|
|||
|
||||
memset(inputSlotToAttr, ~0, sizeof(inputSlotToAttr));
|
||||
|
||||
if (!stfp->glsl_to_tgsi)
|
||||
if (!stfp->glsl_to_tgsi) {
|
||||
_mesa_remove_output_reads(&stfp->Base.Base, PROGRAM_OUTPUT);
|
||||
if (st->ctx->Const.GLSLFragCoordIsSysVal)
|
||||
_mesa_program_fragment_position_to_sysval(&stfp->Base.Base);
|
||||
}
|
||||
|
||||
/*
|
||||
* Convert Mesa program inputs to TGSI input register semantics.
|
||||
|
|
Loading…
Reference in New Issue