mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-23 22:00:13 +01:00
tgsi: Fix POSITION and FACE fragment shader inputs.
This commit is contained in:
parent
b7590cde4a
commit
cc35a454da
2 changed files with 42 additions and 36 deletions
|
|
@ -1832,19 +1832,36 @@ typedef void (* eval_coef_func)(
|
||||||
unsigned chan );
|
unsigned chan );
|
||||||
|
|
||||||
static void
|
static void
|
||||||
exec_declaration(
|
exec_declaration(struct tgsi_exec_machine *mach,
|
||||||
struct tgsi_exec_machine *mach,
|
|
||||||
const struct tgsi_full_declaration *decl)
|
const struct tgsi_full_declaration *decl)
|
||||||
{
|
{
|
||||||
if (mach->Processor == TGSI_PROCESSOR_FRAGMENT) {
|
if (mach->Processor == TGSI_PROCESSOR_FRAGMENT) {
|
||||||
if (decl->Declaration.File == TGSI_FILE_INPUT) {
|
if (decl->Declaration.File == TGSI_FILE_INPUT) {
|
||||||
unsigned first, last, mask;
|
uint first, last, mask;
|
||||||
eval_coef_func eval;
|
|
||||||
|
|
||||||
first = decl->DeclarationRange.First;
|
first = decl->DeclarationRange.First;
|
||||||
last = decl->DeclarationRange.Last;
|
last = decl->DeclarationRange.Last;
|
||||||
mask = decl->Declaration.UsageMask;
|
mask = decl->Declaration.UsageMask;
|
||||||
|
|
||||||
|
if (decl->Semantic.SemanticName == TGSI_SEMANTIC_POSITION) {
|
||||||
|
assert(decl->Semantic.SemanticIndex == 0);
|
||||||
|
assert(first == last);
|
||||||
|
assert(mask = TGSI_WRITEMASK_XYZW);
|
||||||
|
|
||||||
|
mach->Inputs[first] = mach->QuadPos;
|
||||||
|
} else if (decl->Semantic.SemanticName == TGSI_SEMANTIC_FACE) {
|
||||||
|
uint i;
|
||||||
|
|
||||||
|
assert(decl->Semantic.SemanticIndex == 0);
|
||||||
|
assert(first == last);
|
||||||
|
|
||||||
|
for (i = 0; i < QUAD_SIZE; i++) {
|
||||||
|
mach->Inputs[first].xyzw[0].f[i] = mach->Face;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
eval_coef_func eval;
|
||||||
|
uint i, j;
|
||||||
|
|
||||||
switch (decl->Declaration.Interpolate) {
|
switch (decl->Declaration.Interpolate) {
|
||||||
case TGSI_INTERPOLATE_CONSTANT:
|
case TGSI_INTERPOLATE_CONSTANT:
|
||||||
eval = eval_constant_coef;
|
eval = eval_constant_coef;
|
||||||
|
|
@ -1863,18 +1880,6 @@ exec_declaration(
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( mask == TGSI_WRITEMASK_XYZW ) {
|
|
||||||
unsigned i, j;
|
|
||||||
|
|
||||||
for( i = first; i <= last; i++ ) {
|
|
||||||
for( j = 0; j < NUM_CHANNELS; j++ ) {
|
|
||||||
eval( mach, i, j );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
unsigned i, j;
|
|
||||||
|
|
||||||
for (j = 0; j < NUM_CHANNELS; j++) {
|
for (j = 0; j < NUM_CHANNELS; j++) {
|
||||||
if (mask & (1 << j)) {
|
if (mask & (1 << j)) {
|
||||||
for (i = first; i <= last; i++) {
|
for (i = first; i <= last; i++) {
|
||||||
|
|
|
||||||
|
|
@ -232,6 +232,7 @@ struct tgsi_exec_machine
|
||||||
/* FRAGMENT processor only. */
|
/* FRAGMENT processor only. */
|
||||||
const struct tgsi_interp_coef *InterpCoefs;
|
const struct tgsi_interp_coef *InterpCoefs;
|
||||||
struct tgsi_exec_vector QuadPos;
|
struct tgsi_exec_vector QuadPos;
|
||||||
|
float Face; /**< +1 if front facing, -1 if back facing */
|
||||||
|
|
||||||
/* Conditional execution masks */
|
/* Conditional execution masks */
|
||||||
uint CondMask; /**< For IF/ELSE/ENDIF */
|
uint CondMask; /**< For IF/ELSE/ENDIF */
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue