r300: cache translated fragment programs
This commit is contained in:
@@ -546,7 +546,7 @@ struct r500_fragment_program_code {
|
||||
* to render with that program.
|
||||
*/
|
||||
struct r300_fragment_program {
|
||||
struct gl_fragment_program Base;
|
||||
struct gl_program *Base;
|
||||
|
||||
GLboolean translated;
|
||||
GLboolean error;
|
||||
@@ -559,6 +559,13 @@ struct r300_fragment_program {
|
||||
|
||||
GLboolean writes_depth;
|
||||
GLuint optimization;
|
||||
|
||||
struct r300_fragment_program *next;
|
||||
};
|
||||
|
||||
struct r300_fragment_program_cont {
|
||||
struct gl_fragment_program Base;
|
||||
struct r300_fragment_program *progs;
|
||||
};
|
||||
|
||||
struct r300_fragment_program_compiler {
|
||||
@@ -633,6 +640,7 @@ struct r300_context {
|
||||
struct r300_hw_state hw;
|
||||
|
||||
struct r300_vertex_program *selected_vp;
|
||||
struct r300_fragment_program *selected_fp;
|
||||
|
||||
/* Vertex buffers
|
||||
*/
|
||||
|
||||
@@ -67,7 +67,7 @@ static void nqssadce_init(struct nqssadce_state* s)
|
||||
*/
|
||||
static void insert_WPOS_trailer(struct r300_fragment_program_compiler *compiler)
|
||||
{
|
||||
GLuint InputsRead = compiler->fp->Base.Base.InputsRead;
|
||||
GLuint InputsRead = compiler->fp->Base->InputsRead;
|
||||
|
||||
if (!(InputsRead & FRAG_BIT_WPOS))
|
||||
return;
|
||||
@@ -168,7 +168,7 @@ static GLuint build_func(GLuint comparefunc)
|
||||
*/
|
||||
static void build_state(
|
||||
r300ContextPtr r300,
|
||||
struct r300_fragment_program *fp,
|
||||
struct gl_fragment_program *fp,
|
||||
struct r300_fragment_program_external_state *state)
|
||||
{
|
||||
int unit;
|
||||
@@ -176,7 +176,7 @@ static void build_state(
|
||||
_mesa_bzero(state, sizeof(*state));
|
||||
|
||||
for(unit = 0; unit < 16; ++unit) {
|
||||
if (fp->Base.Base.ShadowSamplers & (1 << unit)) {
|
||||
if (fp->Base.ShadowSamplers & (1 << unit)) {
|
||||
struct gl_texture_object* tex = r300->radeon.glCtx->Texture.Unit[unit]._Current;
|
||||
|
||||
state->unit[unit].depth_texture_mode = build_dtm(tex->DepthMode);
|
||||
@@ -185,96 +185,107 @@ static void build_state(
|
||||
}
|
||||
}
|
||||
|
||||
void r300TranslateFragmentShader(GLcontext *ctx, struct gl_fragment_program *fp)
|
||||
void r300TranslateFragmentShader(GLcontext *ctx, struct r300_fragment_program *fp)
|
||||
{
|
||||
r300ContextPtr r300 = R300_CONTEXT(ctx);
|
||||
struct r300_fragment_program *r300_fp = (struct r300_fragment_program *)fp;
|
||||
struct r300_fragment_program_compiler compiler;
|
||||
|
||||
compiler.r300 = r300;
|
||||
compiler.fp = fp;
|
||||
compiler.code = &fp->code;
|
||||
compiler.program = fp->Base;
|
||||
|
||||
if (RADEON_DEBUG & DEBUG_PIXEL) {
|
||||
fflush(stdout);
|
||||
_mesa_printf("Fragment Program: Initial program:\n");
|
||||
_mesa_print_program(compiler.program);
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
insert_WPOS_trailer(&compiler);
|
||||
|
||||
if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
|
||||
struct radeon_program_transformation transformations[] = {
|
||||
{ &r500_transform_TEX, &compiler },
|
||||
{ &radeonTransformALU, 0 },
|
||||
{ &radeonTransformDeriv, 0 },
|
||||
{ &radeonTransformTrigScale, 0 }
|
||||
};
|
||||
radeonLocalTransform(ctx, compiler.program, 4, transformations);
|
||||
} else {
|
||||
struct radeon_program_transformation transformations[] = {
|
||||
{ &r300_transform_TEX, &compiler },
|
||||
{ &radeonTransformALU, 0 },
|
||||
{ &radeonTransformTrigSimple, 0 }
|
||||
};
|
||||
radeonLocalTransform(ctx, compiler.program, 3, transformations);
|
||||
}
|
||||
|
||||
if (RADEON_DEBUG & DEBUG_PIXEL) {
|
||||
_mesa_printf("Fragment Program: After native rewrite:\n");
|
||||
_mesa_print_program(compiler.program);
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
|
||||
struct radeon_nqssadce_descr nqssadce = {
|
||||
.Init = &nqssadce_init,
|
||||
.IsNativeSwizzle = &r500FPIsNativeSwizzle,
|
||||
.BuildSwizzle = &r500FPBuildSwizzle,
|
||||
.RewriteDepthOut = GL_TRUE
|
||||
};
|
||||
radeonNqssaDce(ctx, compiler.program, &nqssadce);
|
||||
} else {
|
||||
struct radeon_nqssadce_descr nqssadce = {
|
||||
.Init = &nqssadce_init,
|
||||
.IsNativeSwizzle = &r300FPIsNativeSwizzle,
|
||||
.BuildSwizzle = &r300FPBuildSwizzle,
|
||||
.RewriteDepthOut = GL_TRUE
|
||||
};
|
||||
radeonNqssaDce(ctx, compiler.program, &nqssadce);
|
||||
}
|
||||
|
||||
if (RADEON_DEBUG & DEBUG_PIXEL) {
|
||||
_mesa_printf("Compiler: after NqSSA-DCE:\n");
|
||||
_mesa_print_program(compiler.program);
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
if (!r300->vtbl.BuildFragmentProgramHwCode(&compiler))
|
||||
fp->error = GL_TRUE;
|
||||
|
||||
fp->translated = GL_TRUE;
|
||||
|
||||
if (fp->error || (RADEON_DEBUG & DEBUG_PIXEL))
|
||||
r300->vtbl.FragmentProgramDump(&fp->code);
|
||||
}
|
||||
|
||||
struct r300_fragment_program *r300SelectFragmentShader(GLcontext *ctx)
|
||||
{
|
||||
r300ContextPtr r300 = R300_CONTEXT(ctx);
|
||||
struct r300_fragment_program_cont *fp_list;
|
||||
struct r300_fragment_program *fp;
|
||||
struct r300_fragment_program_external_state state;
|
||||
|
||||
build_state(r300, r300_fp, &state);
|
||||
if (_mesa_memcmp(&r300_fp->state, &state, sizeof(state))) {
|
||||
/* TODO: cache compiled programs */
|
||||
r300_fp->translated = GL_FALSE;
|
||||
_mesa_memcpy(&r300_fp->state, &state, sizeof(state));
|
||||
fp_list = (struct r300_fragment_program_cont *)ctx->FragmentProgram._Current;
|
||||
build_state(r300, ctx->FragmentProgram._Current, &state);
|
||||
|
||||
fp = fp_list->progs;
|
||||
while (fp) {
|
||||
if (_mesa_memcmp(&fp->state, &state, sizeof(state)) == 0) {
|
||||
return r300->selected_fp = fp;
|
||||
}
|
||||
fp = fp->next;
|
||||
}
|
||||
|
||||
if (!r300_fp->translated) {
|
||||
struct r300_fragment_program_compiler compiler;
|
||||
fp = _mesa_calloc(sizeof(struct r300_fragment_program));
|
||||
|
||||
compiler.r300 = r300;
|
||||
compiler.fp = r300_fp;
|
||||
compiler.code = &r300_fp->code;
|
||||
compiler.program = _mesa_clone_program(ctx, &fp->Base);
|
||||
fp->state = state;
|
||||
fp->translated = GL_FALSE;
|
||||
fp->Base = _mesa_clone_program(ctx, &ctx->FragmentProgram._Current->Base);
|
||||
|
||||
if (RADEON_DEBUG & DEBUG_PIXEL) {
|
||||
fflush(stdout);
|
||||
_mesa_printf("Fragment Program: Initial program:\n");
|
||||
_mesa_print_program(compiler.program);
|
||||
fflush(stdout);
|
||||
}
|
||||
fp->next = fp_list->progs;
|
||||
fp_list->progs = fp;
|
||||
|
||||
insert_WPOS_trailer(&compiler);
|
||||
|
||||
if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
|
||||
struct radeon_program_transformation transformations[] = {
|
||||
{ &r500_transform_TEX, &compiler },
|
||||
{ &radeonTransformALU, 0 },
|
||||
{ &radeonTransformDeriv, 0 },
|
||||
{ &radeonTransformTrigScale, 0 }
|
||||
};
|
||||
radeonLocalTransform(ctx, compiler.program, 4, transformations);
|
||||
} else {
|
||||
struct radeon_program_transformation transformations[] = {
|
||||
{ &r300_transform_TEX, &compiler },
|
||||
{ &radeonTransformALU, 0 },
|
||||
{ &radeonTransformTrigSimple, 0 }
|
||||
};
|
||||
radeonLocalTransform(ctx, compiler.program, 3, transformations);
|
||||
}
|
||||
|
||||
if (RADEON_DEBUG & DEBUG_PIXEL) {
|
||||
_mesa_printf("Fragment Program: After native rewrite:\n");
|
||||
_mesa_print_program(compiler.program);
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
if (r300->radeon.radeonScreen->chip_family >= CHIP_FAMILY_RV515) {
|
||||
struct radeon_nqssadce_descr nqssadce = {
|
||||
.Init = &nqssadce_init,
|
||||
.IsNativeSwizzle = &r500FPIsNativeSwizzle,
|
||||
.BuildSwizzle = &r500FPBuildSwizzle,
|
||||
.RewriteDepthOut = GL_TRUE
|
||||
};
|
||||
radeonNqssaDce(ctx, compiler.program, &nqssadce);
|
||||
} else {
|
||||
struct radeon_nqssadce_descr nqssadce = {
|
||||
.Init = &nqssadce_init,
|
||||
.IsNativeSwizzle = &r300FPIsNativeSwizzle,
|
||||
.BuildSwizzle = &r300FPBuildSwizzle,
|
||||
.RewriteDepthOut = GL_TRUE
|
||||
};
|
||||
radeonNqssaDce(ctx, compiler.program, &nqssadce);
|
||||
}
|
||||
|
||||
if (RADEON_DEBUG & DEBUG_PIXEL) {
|
||||
_mesa_printf("Compiler: after NqSSA-DCE:\n");
|
||||
_mesa_print_program(compiler.program);
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
if (!r300->vtbl.BuildFragmentProgramHwCode(&compiler))
|
||||
r300_fp->error = GL_TRUE;
|
||||
|
||||
/* Subtle: Rescue any parameters that have been added during transformations */
|
||||
_mesa_free_parameter_list(fp->Base.Parameters);
|
||||
fp->Base.Parameters = compiler.program->Parameters;
|
||||
compiler.program->Parameters = 0;
|
||||
|
||||
_mesa_reference_program(ctx, &compiler.program, NULL);
|
||||
|
||||
r300_fp->translated = GL_TRUE;
|
||||
|
||||
if (r300_fp->error || (RADEON_DEBUG & DEBUG_PIXEL))
|
||||
r300->vtbl.FragmentProgramDump(&r300_fp->code);
|
||||
}
|
||||
return r300->selected_fp = fp;
|
||||
}
|
||||
|
||||
@@ -30,6 +30,10 @@
|
||||
|
||||
#include "main/mtypes.h"
|
||||
|
||||
extern void r300TranslateFragmentShader(GLcontext *ctx, struct gl_fragment_program *fp);
|
||||
#include "r300_context.h"
|
||||
|
||||
extern void r300TranslateFragmentShader(GLcontext *ctx, struct r300_fragment_program *fp);
|
||||
|
||||
struct r300_fragment_program *r300SelectFragmentShader(GLcontext *ctx);
|
||||
|
||||
#endif
|
||||
|
||||
@@ -32,11 +32,34 @@
|
||||
#include "r300_context.h"
|
||||
#include "r300_fragprog_common.h"
|
||||
|
||||
static void freeFragProgCache(GLcontext *ctx, struct r300_fragment_program_cont *cache)
|
||||
{
|
||||
struct r300_fragment_program *tmp, *fp = cache->progs;
|
||||
|
||||
while (fp) {
|
||||
tmp = fp->next;
|
||||
_mesa_reference_program(ctx, &fp->Base, NULL);
|
||||
_mesa_free(fp);
|
||||
fp = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
static void freeVertProgCache(GLcontext *ctx, struct r300_vertex_program_cont *cache)
|
||||
{
|
||||
struct r300_vertex_program *tmp, *vp = cache->progs;
|
||||
|
||||
while (vp) {
|
||||
tmp = vp->next;
|
||||
_mesa_free(vp);
|
||||
vp = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
static struct gl_program *r300NewProgram(GLcontext * ctx, GLenum target,
|
||||
GLuint id)
|
||||
{
|
||||
struct r300_vertex_program_cont *vp;
|
||||
struct r300_fragment_program *fp;
|
||||
struct r300_fragment_program_cont *fp;
|
||||
|
||||
switch (target) {
|
||||
case GL_VERTEX_STATE_PROGRAM_NV:
|
||||
@@ -47,7 +70,7 @@ static struct gl_program *r300NewProgram(GLcontext * ctx, GLenum target,
|
||||
|
||||
case GL_FRAGMENT_PROGRAM_NV:
|
||||
case GL_FRAGMENT_PROGRAM_ARB:
|
||||
fp = CALLOC_STRUCT(r300_fragment_program);
|
||||
fp = CALLOC_STRUCT(r300_fragment_program_cont);
|
||||
return _mesa_init_fragment_program(ctx, &fp->Base, target, id);
|
||||
|
||||
default:
|
||||
@@ -59,21 +82,35 @@ static struct gl_program *r300NewProgram(GLcontext * ctx, GLenum target,
|
||||
|
||||
static void r300DeleteProgram(GLcontext * ctx, struct gl_program *prog)
|
||||
{
|
||||
struct r300_vertex_program_cont *vp = (struct r300_vertex_program_cont *)prog;
|
||||
struct r300_fragment_program_cont *fp = (struct r300_fragment_program_cont *)prog;
|
||||
|
||||
switch (prog->Target) {
|
||||
case GL_VERTEX_PROGRAM_ARB:
|
||||
freeVertProgCache(ctx, vp);
|
||||
break;
|
||||
case GL_FRAGMENT_PROGRAM_ARB:
|
||||
freeFragProgCache(ctx, fp);
|
||||
break;
|
||||
}
|
||||
|
||||
_mesa_delete_program(ctx, prog);
|
||||
}
|
||||
|
||||
static void
|
||||
r300ProgramStringNotify(GLcontext * ctx, GLenum target, struct gl_program *prog)
|
||||
{
|
||||
struct r300_vertex_program_cont *vp = (void *)prog;
|
||||
struct r300_fragment_program *r300_fp = (struct r300_fragment_program *)prog;
|
||||
struct r300_vertex_program_cont *vp = (struct r300_vertex_program_cont *)prog;
|
||||
struct r300_fragment_program_cont *fp = (struct r300_fragment_program_cont *)prog;
|
||||
|
||||
switch (target) {
|
||||
case GL_VERTEX_PROGRAM_ARB:
|
||||
freeVertProgCache(ctx, vp);
|
||||
vp->progs = NULL;
|
||||
break;
|
||||
case GL_FRAGMENT_PROGRAM_ARB:
|
||||
r300_fp->translated = GL_FALSE;
|
||||
freeFragProgCache(ctx, fp);
|
||||
fp->progs = NULL;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -85,9 +122,9 @@ static GLboolean
|
||||
r300IsProgramNative(GLcontext * ctx, GLenum target, struct gl_program *prog)
|
||||
{
|
||||
if (target == GL_FRAGMENT_PROGRAM_ARB) {
|
||||
struct r300_fragment_program *fp = (struct r300_fragment_program *)prog;
|
||||
struct r300_fragment_program *fp = r300SelectFragmentShader(ctx);
|
||||
if (!fp->translated)
|
||||
r300TranslateFragmentShader(ctx, &fp->Base);
|
||||
r300TranslateFragmentShader(ctx, fp);
|
||||
|
||||
return !fp->error;
|
||||
} else
|
||||
|
||||
@@ -452,9 +452,9 @@ static void r300SetPolygonOffsetState(GLcontext * ctx, GLboolean state)
|
||||
|
||||
static GLboolean current_fragment_program_writes_depth(GLcontext* ctx)
|
||||
{
|
||||
struct r300_fragment_program *fp = (struct r300_fragment_program *) ctx->FragmentProgram._Current;
|
||||
r300ContextPtr r300 = R300_CONTEXT(ctx);
|
||||
|
||||
return (fp && fp->writes_depth);
|
||||
return ctx->FragmentProgram._Current && r300->selected_fp->writes_depth;
|
||||
}
|
||||
|
||||
static void r300SetEarlyZState(GLcontext * ctx)
|
||||
@@ -1095,18 +1095,17 @@ r300FetchStateParameter(GLcontext * ctx,
|
||||
*/
|
||||
static void r300UpdateStateParameters(GLcontext * ctx, GLuint new_state)
|
||||
{
|
||||
struct r300_fragment_program *fp;
|
||||
r300ContextPtr rmesa = R300_CONTEXT(ctx);
|
||||
struct gl_program_parameter_list *paramList;
|
||||
GLuint i;
|
||||
|
||||
if (!(new_state & (_NEW_BUFFERS | _NEW_PROGRAM | _NEW_PROGRAM_CONSTANTS)))
|
||||
return;
|
||||
|
||||
fp = (struct r300_fragment_program *)ctx->FragmentProgram._Current;
|
||||
if (!fp)
|
||||
if (!ctx->FragmentProgram._Current || !rmesa->selected_fp)
|
||||
return;
|
||||
|
||||
paramList = fp->Base.Base.Parameters;
|
||||
paramList = rmesa->selected_fp->Base->Parameters;
|
||||
|
||||
if (!paramList)
|
||||
return;
|
||||
@@ -1227,8 +1226,7 @@ static void r300SetupFragmentShaderTextures(GLcontext *ctx, int *tmu_mappings)
|
||||
{
|
||||
r300ContextPtr r300 = R300_CONTEXT(ctx);
|
||||
int i;
|
||||
struct r300_fragment_program *fp = (struct r300_fragment_program *) ctx->FragmentProgram._Current;
|
||||
struct r300_fragment_program_code *code = &fp->code.r300;
|
||||
struct r300_fragment_program_code *code = &r300->selected_fp->code.r300;
|
||||
|
||||
R300_STATECHANGE(r300, fpt);
|
||||
|
||||
@@ -1268,9 +1266,9 @@ static void r300SetupFragmentShaderTextures(GLcontext *ctx, int *tmu_mappings)
|
||||
|
||||
static void r500SetupFragmentShaderTextures(GLcontext *ctx, int *tmu_mappings)
|
||||
{
|
||||
r300ContextPtr r300 = R300_CONTEXT(ctx);
|
||||
int i;
|
||||
struct r300_fragment_program *fp = (struct r300_fragment_program *) ctx->FragmentProgram._Current;
|
||||
struct r500_fragment_program_code *code = &fp->code.r500;
|
||||
struct r500_fragment_program_code *code = &r300->selected_fp->code.r500;
|
||||
|
||||
/* find all the texture instructions and relocate the texture units */
|
||||
for (i = 0; i < code->inst_end + 1; i++) {
|
||||
@@ -1318,8 +1316,6 @@ static void r300SetupTextures(GLcontext * ctx)
|
||||
int hw_tmu = 0;
|
||||
int last_hw_tmu = -1; /* -1 translates into no setup costs for fields */
|
||||
int tmu_mappings[R300_MAX_TEXTURE_UNITS] = { -1, };
|
||||
struct r300_fragment_program *fp = (struct r300_fragment_program *)
|
||||
(char *)ctx->FragmentProgram._Current;
|
||||
|
||||
R300_STATECHANGE(r300, txe);
|
||||
R300_STATECHANGE(r300, tex.filter);
|
||||
@@ -1422,7 +1418,7 @@ static void r300SetupTextures(GLcontext * ctx)
|
||||
cmdpacket0(r300->radeon.radeonScreen, R300_TX_BORDER_COLOR_0, last_hw_tmu + 1);
|
||||
|
||||
if (r300->radeon.radeonScreen->chip_family < CHIP_FAMILY_RV515) {
|
||||
if (fp->Base.UsesKill && last_hw_tmu < 0) {
|
||||
if (ctx->FragmentProgram._Current->UsesKill && last_hw_tmu < 0) {
|
||||
// The KILL operation requires the first texture unit
|
||||
// to be enabled.
|
||||
r300->hw.txe.cmd[R300_TXE_ENABLE] |= 1;
|
||||
@@ -1464,7 +1460,7 @@ static void r300SetupRSUnit(GLcontext * ctx)
|
||||
else
|
||||
RENDERINPUTS_COPY(OutputsWritten.index_bitset, r300->render_inputs_bitset);
|
||||
|
||||
InputsRead = ctx->FragmentProgram._Current->Base.InputsRead;
|
||||
InputsRead = r300->selected_fp->Base->InputsRead;
|
||||
|
||||
R300_STATECHANGE(r300, ri);
|
||||
R300_STATECHANGE(r300, rc);
|
||||
@@ -1581,7 +1577,7 @@ static void r500SetupRSUnit(GLcontext * ctx)
|
||||
else
|
||||
RENDERINPUTS_COPY(OutputsWritten.index_bitset, r300->render_inputs_bitset);
|
||||
|
||||
InputsRead = ctx->FragmentProgram._Current->Base.InputsRead;
|
||||
InputsRead = r300->selected_fp->Base->InputsRead;
|
||||
|
||||
R300_STATECHANGE(r300, ri);
|
||||
R300_STATECHANGE(r300, rc);
|
||||
@@ -2038,21 +2034,18 @@ static void r300ResetHwState(r300ContextPtr r300)
|
||||
|
||||
void r300UpdateShaders(r300ContextPtr rmesa)
|
||||
{
|
||||
GLcontext *ctx;
|
||||
GLcontext *ctx = rmesa->radeon.glCtx;
|
||||
struct r300_fragment_program *fp;
|
||||
int i;
|
||||
|
||||
ctx = rmesa->radeon.glCtx;
|
||||
fp = (struct r300_fragment_program *) ctx->FragmentProgram._Current;
|
||||
|
||||
/* should only happenen once, just after context is created */
|
||||
/* TODO: shouldn't we fallback to sw here? */
|
||||
if (!fp) {
|
||||
if (!ctx->FragmentProgram._Current) {
|
||||
_mesa_fprintf(stderr, "No ctx->FragmentProgram._Current!!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
if (rmesa->radeon.NewGLState && rmesa->options.hw_tcl_enabled) {
|
||||
int i;
|
||||
for (i = _TNL_FIRST_MAT; i <= _TNL_LAST_MAT; i++) {
|
||||
rmesa->temp_attrib[i] =
|
||||
TNL_CONTEXT(ctx)->vb.AttribPtr[i];
|
||||
@@ -2071,8 +2064,9 @@ void r300UpdateShaders(r300ContextPtr rmesa)
|
||||
r300SwitchFallback(ctx, R300_FALLBACK_VERTEX_PROGRAM, rmesa->selected_vp->error);
|
||||
}
|
||||
|
||||
if (!fp->translated || rmesa->radeon.NewGLState)
|
||||
r300TranslateFragmentShader(ctx, ctx->FragmentProgram._Current);
|
||||
fp = r300SelectFragmentShader(ctx);
|
||||
if (!fp->translated)
|
||||
r300TranslateFragmentShader(ctx, fp);
|
||||
|
||||
r300SwitchFallback(ctx, R300_FALLBACK_FRAGMENT_PROGRAM, fp->error);
|
||||
|
||||
@@ -2104,7 +2098,7 @@ static const GLfloat *get_fragmentprogram_constant(GLcontext *ctx,
|
||||
static void r300SetupPixelShader(GLcontext *ctx)
|
||||
{
|
||||
r300ContextPtr rmesa = R300_CONTEXT(ctx);
|
||||
struct r300_fragment_program *fp = (struct r300_fragment_program *) ctx->FragmentProgram._Current;
|
||||
struct r300_fragment_program *fp = rmesa->selected_fp;
|
||||
struct r300_fragment_program_code *code;
|
||||
int i, k;
|
||||
|
||||
@@ -2150,8 +2144,7 @@ static void r300SetupPixelShader(GLcontext *ctx)
|
||||
R300_STATECHANGE(rmesa, fpp);
|
||||
rmesa->hw.fpp.cmd[R300_FPP_CMD_0] = cmdpacket0(rmesa->radeon.radeonScreen, R300_PFS_PARAM_0_X, code->const_nr * 4);
|
||||
for (i = 0; i < code->const_nr; i++) {
|
||||
const GLfloat *constant = get_fragmentprogram_constant(ctx,
|
||||
&fp->Base.Base, code->constant[i]);
|
||||
const GLfloat *constant = get_fragmentprogram_constant(ctx, fp->Base, code->constant[i]);
|
||||
rmesa->hw.fpp.cmd[R300_FPP_PARAM_0 + 4 * i + 0] = r300PackFloat24(constant[0]);
|
||||
rmesa->hw.fpp.cmd[R300_FPP_PARAM_0 + 4 * i + 1] = r300PackFloat24(constant[1]);
|
||||
rmesa->hw.fpp.cmd[R300_FPP_PARAM_0 + 4 * i + 2] = r300PackFloat24(constant[2]);
|
||||
@@ -2176,7 +2169,7 @@ static void r300SetupPixelShader(GLcontext *ctx)
|
||||
static void r500SetupPixelShader(GLcontext *ctx)
|
||||
{
|
||||
r300ContextPtr rmesa = R300_CONTEXT(ctx);
|
||||
struct r300_fragment_program *fp = (struct r300_fragment_program *) ctx->FragmentProgram._Current;
|
||||
struct r300_fragment_program *fp = rmesa->selected_fp;
|
||||
int i;
|
||||
struct r500_fragment_program_code *code;
|
||||
|
||||
@@ -2212,8 +2205,7 @@ static void r500SetupPixelShader(GLcontext *ctx)
|
||||
|
||||
R300_STATECHANGE(rmesa, r500fp_const);
|
||||
for (i = 0; i < code->const_nr; i++) {
|
||||
const GLfloat *constant = get_fragmentprogram_constant(ctx,
|
||||
&fp->Base.Base, code->constant[i]);
|
||||
const GLfloat *constant = get_fragmentprogram_constant(ctx, fp->Base, code->constant[i]);
|
||||
rmesa->hw.r500fp_const.cmd[R300_FPP_PARAM_0 + 4 * i + 0] = r300PackFloat32(constant[0]);
|
||||
rmesa->hw.r500fp_const.cmd[R300_FPP_PARAM_0 + 4 * i + 1] = r300PackFloat32(constant[1]);
|
||||
rmesa->hw.r500fp_const.cmd[R300_FPP_PARAM_0 + 4 * i + 2] = r300PackFloat32(constant[2]);
|
||||
@@ -2276,20 +2268,17 @@ void r300SetupVAP(GLcontext *ctx, GLuint InputsRead, GLuint OutputsWritten)
|
||||
|
||||
rmesa->hw.vic.cmd[R300_VIC_CNTL_0] = r300VAPInputCntl0(ctx, InputsRead);
|
||||
rmesa->hw.vic.cmd[R300_VIC_CNTL_1] = r300VAPInputCntl1(ctx, InputsRead);
|
||||
rmesa->hw.vof.cmd[R300_VOF_CNTL_0] = r300VAPOutputCntl0(ctx, OutputsWritten, ctx->FragmentProgram._Current->Base.InputsRead);
|
||||
rmesa->hw.vof.cmd[R300_VOF_CNTL_1] = r300VAPOutputCntl1(ctx, OutputsWritten, ctx->FragmentProgram._Current->Base.InputsRead);
|
||||
rmesa->hw.vof.cmd[R300_VOF_CNTL_0] = r300VAPOutputCntl0(ctx, OutputsWritten, rmesa->selected_fp->Base->InputsRead);
|
||||
rmesa->hw.vof.cmd[R300_VOF_CNTL_1] = r300VAPOutputCntl1(ctx, OutputsWritten, rmesa->selected_fp->Base->InputsRead);
|
||||
}
|
||||
|
||||
void r300UpdateShaderStates(r300ContextPtr rmesa)
|
||||
{
|
||||
GLcontext *ctx;
|
||||
ctx = rmesa->radeon.glCtx;
|
||||
struct r300_fragment_program *r300_fp;
|
||||
|
||||
r300_fp = (struct r300_fragment_program *) ctx->FragmentProgram._Current;
|
||||
|
||||
/* should only happenen once, just after context is created */
|
||||
if (!r300_fp)
|
||||
if (!ctx->FragmentProgram._Current)
|
||||
return;
|
||||
|
||||
r300SetEarlyZState(ctx);
|
||||
|
||||
@@ -76,7 +76,7 @@ void r300ChooseSwtclVertexFormat(GLcontext *ctx, GLuint *_InputsRead, GLuint *_
|
||||
GLuint InputsRead = 0;
|
||||
GLuint OutputsWritten = 0;
|
||||
int num_attrs = 0;
|
||||
GLuint fp_reads = ctx->FragmentProgram._Current->Base.InputsRead;
|
||||
GLuint fp_reads = rmesa->selected_fp->Base->InputsRead;
|
||||
struct vertex_attribute *attrs = rmesa->vbuf.attribs;
|
||||
|
||||
rmesa->swtcl.coloroffset = rmesa->swtcl.specoffset = 0;
|
||||
|
||||
Reference in New Issue
Block a user