r300: Implement ARB_shadow_ambient; add STATE_SHADOW_AMBIENT
This commit is contained in:
@@ -101,6 +101,7 @@ const struct dri_extension card_extensions[] = {
|
|||||||
{"GL_ARB_multitexture", NULL},
|
{"GL_ARB_multitexture", NULL},
|
||||||
{"GL_ARB_point_parameters", GL_ARB_point_parameters_functions},
|
{"GL_ARB_point_parameters", GL_ARB_point_parameters_functions},
|
||||||
{"GL_ARB_shadow", NULL},
|
{"GL_ARB_shadow", NULL},
|
||||||
|
{"GL_ARB_shadow_ambient", NULL},
|
||||||
{"GL_ARB_texture_border_clamp", NULL},
|
{"GL_ARB_texture_border_clamp", NULL},
|
||||||
{"GL_ARB_texture_compression", GL_ARB_texture_compression_functions},
|
{"GL_ARB_texture_compression", GL_ARB_texture_compression_functions},
|
||||||
{"GL_ARB_texture_cube_map", NULL},
|
{"GL_ARB_texture_cube_map", NULL},
|
||||||
|
@@ -58,6 +58,20 @@ static void reset_srcreg(struct prog_src_register* reg)
|
|||||||
reg->Swizzle = SWIZZLE_NOOP;
|
reg->Swizzle = SWIZZLE_NOOP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct prog_src_register shadow_ambient(struct gl_program *program, int tmu)
|
||||||
|
{
|
||||||
|
gl_state_index fail_value_tokens[STATE_LENGTH] = {
|
||||||
|
STATE_INTERNAL, STATE_SHADOW_AMBIENT, 0, 0, 0
|
||||||
|
};
|
||||||
|
struct prog_src_register reg = { 0, };
|
||||||
|
|
||||||
|
fail_value_tokens[2] = tmu;
|
||||||
|
reg.File = PROGRAM_STATE_VAR;
|
||||||
|
reg.Index = _mesa_add_state_reference(program->Parameters, fail_value_tokens);
|
||||||
|
reg.Swizzle = SWIZZLE_WWWW;
|
||||||
|
return reg;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Transform TEX, TXP, TXB, and KIL instructions in the following way:
|
* Transform TEX, TXP, TXB, and KIL instructions in the following way:
|
||||||
* - premultiply texture coordinates for RECT
|
* - premultiply texture coordinates for RECT
|
||||||
@@ -92,8 +106,12 @@ static GLboolean transform_TEX(
|
|||||||
|
|
||||||
tgt->Opcode = OPCODE_MOV;
|
tgt->Opcode = OPCODE_MOV;
|
||||||
tgt->DstReg = inst.DstReg;
|
tgt->DstReg = inst.DstReg;
|
||||||
tgt->SrcReg[0].File = PROGRAM_BUILTIN;
|
if (comparefunc == GL_ALWAYS) {
|
||||||
tgt->SrcReg[0].Swizzle = comparefunc == GL_ALWAYS ? SWIZZLE_1111 : SWIZZLE_0000;
|
tgt->SrcReg[0].File = PROGRAM_BUILTIN;
|
||||||
|
tgt->SrcReg[0].Swizzle = SWIZZLE_1111;
|
||||||
|
} else {
|
||||||
|
tgt->SrcReg[0] = shadow_ambient(t->Program, inst.TexSrcUnit);
|
||||||
|
}
|
||||||
return GL_TRUE;
|
return GL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,6 +171,7 @@ static GLboolean transform_TEX(
|
|||||||
GLuint comparefunc = GL_NEVER + compiler->fp->state.unit[inst.TexSrcUnit].texture_compare_func;
|
GLuint comparefunc = GL_NEVER + compiler->fp->state.unit[inst.TexSrcUnit].texture_compare_func;
|
||||||
GLuint depthmode = compiler->fp->state.unit[inst.TexSrcUnit].depth_texture_mode;
|
GLuint depthmode = compiler->fp->state.unit[inst.TexSrcUnit].depth_texture_mode;
|
||||||
int rcptemp = radeonFindFreeTemporary(t);
|
int rcptemp = radeonFindFreeTemporary(t);
|
||||||
|
int pass, fail;
|
||||||
|
|
||||||
tgt = radeonAppendInstructions(t->Program, 3);
|
tgt = radeonAppendInstructions(t->Program, 3);
|
||||||
|
|
||||||
@@ -190,16 +209,18 @@ static GLboolean transform_TEX(
|
|||||||
tgt[2].DstReg = orig_inst->DstReg;
|
tgt[2].DstReg = orig_inst->DstReg;
|
||||||
tgt[2].SrcReg[0].File = PROGRAM_TEMPORARY;
|
tgt[2].SrcReg[0].File = PROGRAM_TEMPORARY;
|
||||||
tgt[2].SrcReg[0].Index = tgt[1].DstReg.Index;
|
tgt[2].SrcReg[0].Index = tgt[1].DstReg.Index;
|
||||||
tgt[2].SrcReg[1].File = PROGRAM_BUILTIN;
|
|
||||||
tgt[2].SrcReg[2].File = PROGRAM_BUILTIN;
|
|
||||||
|
|
||||||
if (comparefunc == GL_LESS || comparefunc == GL_GREATER) {
|
if (comparefunc == GL_LESS || comparefunc == GL_GREATER) {
|
||||||
tgt[2].SrcReg[1].Swizzle = SWIZZLE_1111;
|
pass = 1;
|
||||||
tgt[2].SrcReg[2].Swizzle = SWIZZLE_0000;
|
fail = 2;
|
||||||
} else {
|
} else {
|
||||||
tgt[2].SrcReg[1].Swizzle = SWIZZLE_0000;
|
pass = 2;
|
||||||
tgt[2].SrcReg[2].Swizzle = SWIZZLE_1111;
|
fail = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tgt[2].SrcReg[pass].File = PROGRAM_BUILTIN;
|
||||||
|
tgt[2].SrcReg[pass].Swizzle = SWIZZLE_1111;
|
||||||
|
tgt[2].SrcReg[fail] = shadow_ambient(t->Program, inst.TexSrcUnit);
|
||||||
} else if (destredirect) {
|
} else if (destredirect) {
|
||||||
tgt = radeonAppendInstructions(t->Program, 1);
|
tgt = radeonAppendInstructions(t->Program, 1);
|
||||||
|
|
||||||
|
@@ -31,6 +31,20 @@
|
|||||||
#include "radeon_program_alu.h"
|
#include "radeon_program_alu.h"
|
||||||
|
|
||||||
|
|
||||||
|
static struct prog_src_register shadow_ambient(struct gl_program *program, int tmu)
|
||||||
|
{
|
||||||
|
gl_state_index fail_value_tokens[STATE_LENGTH] = {
|
||||||
|
STATE_INTERNAL, STATE_SHADOW_AMBIENT, 0, 0, 0
|
||||||
|
};
|
||||||
|
struct prog_src_register reg = { 0, };
|
||||||
|
|
||||||
|
fail_value_tokens[2] = tmu;
|
||||||
|
reg.File = PROGRAM_STATE_VAR;
|
||||||
|
reg.Index = _mesa_add_state_reference(program->Parameters, fail_value_tokens);
|
||||||
|
reg.Swizzle = SWIZZLE_WWWW;
|
||||||
|
return reg;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Transform TEX, TXP, TXB, and KIL instructions in the following way:
|
* Transform TEX, TXP, TXB, and KIL instructions in the following way:
|
||||||
* - premultiply texture coordinates for RECT
|
* - premultiply texture coordinates for RECT
|
||||||
@@ -63,11 +77,13 @@ static GLboolean transform_TEX(
|
|||||||
tgt = radeonAppendInstructions(t->Program, 1);
|
tgt = radeonAppendInstructions(t->Program, 1);
|
||||||
|
|
||||||
tgt->Opcode = OPCODE_MOV;
|
tgt->Opcode = OPCODE_MOV;
|
||||||
tgt->DstReg.File = inst.DstReg.File;
|
tgt->DstReg = inst.DstReg;
|
||||||
tgt->DstReg.Index = inst.DstReg.Index;
|
if (comparefunc == GL_ALWAYS) {
|
||||||
tgt->DstReg.WriteMask = inst.DstReg.WriteMask;
|
tgt->SrcReg[0].File = PROGRAM_BUILTIN;
|
||||||
tgt->SrcReg[0].File = PROGRAM_BUILTIN;
|
tgt->SrcReg[0].Swizzle = SWIZZLE_1111;
|
||||||
tgt->SrcReg[0].Swizzle = comparefunc == GL_ALWAYS ? SWIZZLE_1111 : SWIZZLE_0000;
|
} else {
|
||||||
|
tgt->SrcReg[0] = shadow_ambient(t->Program, inst.TexSrcUnit);
|
||||||
|
}
|
||||||
return GL_TRUE;
|
return GL_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -91,6 +107,7 @@ static GLboolean transform_TEX(
|
|||||||
GLuint comparefunc = GL_NEVER + compiler->fp->state.unit[inst.TexSrcUnit].texture_compare_func;
|
GLuint comparefunc = GL_NEVER + compiler->fp->state.unit[inst.TexSrcUnit].texture_compare_func;
|
||||||
GLuint depthmode = compiler->fp->state.unit[inst.TexSrcUnit].depth_texture_mode;
|
GLuint depthmode = compiler->fp->state.unit[inst.TexSrcUnit].depth_texture_mode;
|
||||||
int rcptemp = radeonFindFreeTemporary(t);
|
int rcptemp = radeonFindFreeTemporary(t);
|
||||||
|
int pass, fail;
|
||||||
|
|
||||||
tgt = radeonAppendInstructions(t->Program, 3);
|
tgt = radeonAppendInstructions(t->Program, 3);
|
||||||
|
|
||||||
@@ -128,16 +145,18 @@ static GLboolean transform_TEX(
|
|||||||
tgt[2].DstReg = orig_inst->DstReg;
|
tgt[2].DstReg = orig_inst->DstReg;
|
||||||
tgt[2].SrcReg[0].File = PROGRAM_TEMPORARY;
|
tgt[2].SrcReg[0].File = PROGRAM_TEMPORARY;
|
||||||
tgt[2].SrcReg[0].Index = tgt[1].DstReg.Index;
|
tgt[2].SrcReg[0].Index = tgt[1].DstReg.Index;
|
||||||
tgt[2].SrcReg[1].File = PROGRAM_BUILTIN;
|
|
||||||
tgt[2].SrcReg[2].File = PROGRAM_BUILTIN;
|
|
||||||
|
|
||||||
if (comparefunc == GL_LESS || comparefunc == GL_GREATER) {
|
if (comparefunc == GL_LESS || comparefunc == GL_GREATER) {
|
||||||
tgt[2].SrcReg[1].Swizzle = SWIZZLE_1111;
|
pass = 1;
|
||||||
tgt[2].SrcReg[2].Swizzle = SWIZZLE_0000;
|
fail = 2;
|
||||||
} else {
|
} else {
|
||||||
tgt[2].SrcReg[1].Swizzle = SWIZZLE_0000;
|
pass = 2;
|
||||||
tgt[2].SrcReg[2].Swizzle = SWIZZLE_1111;
|
fail = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tgt[2].SrcReg[pass].File = PROGRAM_BUILTIN;
|
||||||
|
tgt[2].SrcReg[pass].Swizzle = SWIZZLE_1111;
|
||||||
|
tgt[2].SrcReg[fail] = shadow_ambient(t->Program, inst.TexSrcUnit);
|
||||||
} else if (destredirect) {
|
} else if (destredirect) {
|
||||||
tgt = radeonAppendInstructions(t->Program, 1);
|
tgt = radeonAppendInstructions(t->Program, 1);
|
||||||
|
|
||||||
|
@@ -458,6 +458,20 @@ _mesa_fetch_state(GLcontext *ctx, const gl_state_index state[],
|
|||||||
case STATE_PCM_BIAS:
|
case STATE_PCM_BIAS:
|
||||||
COPY_4V(value, ctx->Pixel.PostColorMatrixBias);
|
COPY_4V(value, ctx->Pixel.PostColorMatrixBias);
|
||||||
break;
|
break;
|
||||||
|
case STATE_SHADOW_AMBIENT:
|
||||||
|
{
|
||||||
|
const int unit = (int) state[2];
|
||||||
|
const struct gl_texture_object *texObj
|
||||||
|
= ctx->Texture.Unit[unit]._Current;
|
||||||
|
if (texObj) {
|
||||||
|
value[0] = texObj->ShadowAmbient;
|
||||||
|
value[1] = texObj->ShadowAmbient;
|
||||||
|
value[2] = texObj->ShadowAmbient;
|
||||||
|
value[3] = texObj->ShadowAmbient;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
/* unknown state indexes are silently ignored
|
/* unknown state indexes are silently ignored
|
||||||
* should be handled by the driver.
|
* should be handled by the driver.
|
||||||
@@ -532,6 +546,7 @@ _mesa_program_state_flags(const gl_state_index state[STATE_LENGTH])
|
|||||||
case STATE_INTERNAL:
|
case STATE_INTERNAL:
|
||||||
switch (state[1]) {
|
switch (state[1]) {
|
||||||
case STATE_TEXRECT_SCALE:
|
case STATE_TEXRECT_SCALE:
|
||||||
|
case STATE_SHADOW_AMBIENT:
|
||||||
return _NEW_TEXTURE;
|
return _NEW_TEXTURE;
|
||||||
case STATE_FOG_PARAMS_OPTIMIZED:
|
case STATE_FOG_PARAMS_OPTIMIZED:
|
||||||
return _NEW_FOG;
|
return _NEW_FOG;
|
||||||
@@ -711,6 +726,9 @@ append_token(char *dst, gl_state_index k)
|
|||||||
case STATE_PCM_BIAS:
|
case STATE_PCM_BIAS:
|
||||||
append(dst, "PCMbias");
|
append(dst, "PCMbias");
|
||||||
break;
|
break;
|
||||||
|
case STATE_SHADOW_AMBIENT:
|
||||||
|
append(dst, "ShadowAmbient");
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
@@ -113,6 +113,7 @@ typedef enum gl_state_index_ {
|
|||||||
STATE_PT_BIAS, /**< Pixel transfer RGBA bias */
|
STATE_PT_BIAS, /**< Pixel transfer RGBA bias */
|
||||||
STATE_PCM_SCALE, /**< Post color matrix RGBA scale */
|
STATE_PCM_SCALE, /**< Post color matrix RGBA scale */
|
||||||
STATE_PCM_BIAS, /**< Post color matrix RGBA bias */
|
STATE_PCM_BIAS, /**< Post color matrix RGBA bias */
|
||||||
|
STATE_SHADOW_AMBIENT, /**< ARB_shadow_ambient fail value; token[2] is texture unit index */
|
||||||
STATE_INTERNAL_DRIVER /* first available state index for drivers (must be last) */
|
STATE_INTERNAL_DRIVER /* first available state index for drivers (must be last) */
|
||||||
} gl_state_index;
|
} gl_state_index;
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user