mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-01-27 05:30:24 +01:00
r300: Changed some more functions to static functions.
This required reordering some of the functions which is why the diff is a little larger.
This commit is contained in:
parent
82de92c0fb
commit
13c0abd8a7
5 changed files with 216 additions and 248 deletions
|
|
@ -128,7 +128,7 @@ int r300FlushCmdBuf(r300ContextPtr r300, const char *caller)
|
|||
return ret;
|
||||
}
|
||||
|
||||
void r300PrintStateAtom(r300ContextPtr r300, struct r300_state_atom *state)
|
||||
static void r300PrintStateAtom(r300ContextPtr r300, struct r300_state_atom *state)
|
||||
{
|
||||
int i;
|
||||
int dwords = (*state->check) (r300, state);
|
||||
|
|
|
|||
|
|
@ -668,27 +668,6 @@ void r300AllocDmaRegion(r300ContextPtr rmesa,
|
|||
|
||||
#endif
|
||||
|
||||
/* Called via glXGetMemoryOffsetMESA() */
|
||||
GLuint r300GetMemoryOffsetMESA(__DRInativeDisplay * dpy, int scrn,
|
||||
const GLvoid * pointer)
|
||||
{
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
r300ContextPtr rmesa;
|
||||
GLuint card_offset;
|
||||
|
||||
if (!ctx || !(rmesa = R300_CONTEXT(ctx))) {
|
||||
fprintf(stderr, "%s: no context\n", __FUNCTION__);
|
||||
return ~0;
|
||||
}
|
||||
|
||||
if (!r300IsGartMemory(rmesa, pointer, 0))
|
||||
return ~0;
|
||||
|
||||
card_offset = r300GartOffsetFromVirtual(rmesa, pointer);
|
||||
|
||||
return card_offset - rmesa->radeon.radeonScreen->gart_base;
|
||||
}
|
||||
|
||||
GLboolean r300IsGartMemory(r300ContextPtr rmesa, const GLvoid * pointer,
|
||||
GLint size)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -39,9 +39,6 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
#include "r300_context.h"
|
||||
#include "radeon_drm.h"
|
||||
|
||||
extern GLuint r300GetMemoryOffsetMESA(__DRInativeDisplay * dpy, int scrn,
|
||||
const GLvoid * pointer);
|
||||
|
||||
extern GLboolean r300IsGartMemory(r300ContextPtr rmesa,
|
||||
const GLvoid * pointer, GLint size);
|
||||
|
||||
|
|
|
|||
|
|
@ -976,7 +976,7 @@ static void r300ClearStencil(GLcontext * ctx, GLint s)
|
|||
#define SUBPIXEL_X 0.125
|
||||
#define SUBPIXEL_Y 0.125
|
||||
|
||||
void r300UpdateWindow(GLcontext * ctx)
|
||||
static void r300UpdateWindow(GLcontext * ctx)
|
||||
{
|
||||
r300ContextPtr rmesa = R300_CONTEXT(ctx);
|
||||
__DRIdrawablePrivate *dPriv = rmesa->radeon.dri.drawable;
|
||||
|
|
@ -1642,8 +1642,6 @@ void static inline setup_vertex_shader_fragment(r300ContextPtr r300, int dest, s
|
|||
}
|
||||
}
|
||||
|
||||
void r300SetupVertexProgram(r300ContextPtr rmesa);
|
||||
|
||||
/* just a skeleton for now.. */
|
||||
|
||||
/* Generate a vertex shader that simply transforms vertex and texture coordinates,
|
||||
|
|
@ -1699,7 +1697,62 @@ static void r300GenerateSimpleVertexShader(r300ContextPtr r300)
|
|||
|
||||
}
|
||||
|
||||
void r300SetupVertexShader(r300ContextPtr rmesa)
|
||||
static void r300SetupVertexProgram(r300ContextPtr rmesa)
|
||||
{
|
||||
GLcontext *ctx = rmesa->radeon.glCtx;
|
||||
int inst_count;
|
||||
int param_count;
|
||||
struct r300_vertex_program *prog =
|
||||
(struct r300_vertex_program *)CURRENT_VERTEX_SHADER(ctx);
|
||||
|
||||
((drm_r300_cmd_header_t *) rmesa->hw.vpp.cmd)->vpu.count = 0;
|
||||
R300_STATECHANGE(rmesa, vpp);
|
||||
param_count =
|
||||
r300VertexProgUpdateParams(ctx, (struct r300_vertex_program_cont *)
|
||||
ctx->VertexProgram._Current /*prog */ ,
|
||||
(float *)&rmesa->hw.vpp.
|
||||
cmd[R300_VPP_PARAM_0]);
|
||||
bump_vpu_count(rmesa->hw.vpp.cmd, param_count);
|
||||
param_count /= 4;
|
||||
|
||||
/* Reset state, in case we don't use something */
|
||||
((drm_r300_cmd_header_t *) rmesa->hw.vpi.cmd)->vpu.count = 0;
|
||||
((drm_r300_cmd_header_t *) rmesa->hw.vps.cmd)->vpu.count = 0;
|
||||
|
||||
setup_vertex_shader_fragment(rmesa, VSF_DEST_PROGRAM, &(prog->program));
|
||||
|
||||
#if 0
|
||||
setup_vertex_shader_fragment(rmesa, VSF_DEST_UNKNOWN1,
|
||||
&(rmesa->state.vertex_shader.unknown1));
|
||||
setup_vertex_shader_fragment(rmesa, VSF_DEST_UNKNOWN2,
|
||||
&(rmesa->state.vertex_shader.unknown2));
|
||||
#endif
|
||||
|
||||
inst_count = prog->program.length / 4 - 1;
|
||||
|
||||
R300_STATECHANGE(rmesa, pvs);
|
||||
rmesa->hw.pvs.cmd[R300_PVS_CNTL_1] =
|
||||
(0 << R300_PVS_CNTL_1_PROGRAM_START_SHIFT)
|
||||
| (inst_count /*pos_end */ << R300_PVS_CNTL_1_POS_END_SHIFT)
|
||||
| (inst_count << R300_PVS_CNTL_1_PROGRAM_END_SHIFT);
|
||||
rmesa->hw.pvs.cmd[R300_PVS_CNTL_2] =
|
||||
(0 << R300_PVS_CNTL_2_PARAM_OFFSET_SHIFT)
|
||||
| (param_count << R300_PVS_CNTL_2_PARAM_COUNT_SHIFT);
|
||||
rmesa->hw.pvs.cmd[R300_PVS_CNTL_3] =
|
||||
(0 /*rmesa->state.vertex_shader.unknown_ptr2 */ <<
|
||||
R300_PVS_CNTL_3_PROGRAM_UNKNOWN_SHIFT)
|
||||
| (inst_count /*rmesa->state.vertex_shader.unknown_ptr3 */ <<
|
||||
0);
|
||||
|
||||
/* This is done for vertex shader fragments, but also needs to be done for vap_pvs,
|
||||
so I leave it as a reminder */
|
||||
#if 0
|
||||
reg_start(R300_VAP_PVS_WAITIDLE, 0);
|
||||
e32(0x00000000);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void r300SetupVertexShader(r300ContextPtr rmesa)
|
||||
{
|
||||
GLcontext *ctx = rmesa->radeon.glCtx;
|
||||
|
||||
|
|
@ -1758,221 +1811,10 @@ void r300SetupVertexShader(r300ContextPtr rmesa)
|
|||
#endif
|
||||
}
|
||||
|
||||
void r300SetupVertexProgram(r300ContextPtr rmesa)
|
||||
{
|
||||
GLcontext *ctx = rmesa->radeon.glCtx;
|
||||
int inst_count;
|
||||
int param_count;
|
||||
struct r300_vertex_program *prog =
|
||||
(struct r300_vertex_program *)CURRENT_VERTEX_SHADER(ctx);
|
||||
|
||||
((drm_r300_cmd_header_t *) rmesa->hw.vpp.cmd)->vpu.count = 0;
|
||||
R300_STATECHANGE(rmesa, vpp);
|
||||
param_count =
|
||||
r300VertexProgUpdateParams(ctx, (struct r300_vertex_program_cont *)
|
||||
ctx->VertexProgram._Current /*prog */ ,
|
||||
(float *)&rmesa->hw.vpp.
|
||||
cmd[R300_VPP_PARAM_0]);
|
||||
bump_vpu_count(rmesa->hw.vpp.cmd, param_count);
|
||||
param_count /= 4;
|
||||
|
||||
/* Reset state, in case we don't use something */
|
||||
((drm_r300_cmd_header_t *) rmesa->hw.vpi.cmd)->vpu.count = 0;
|
||||
((drm_r300_cmd_header_t *) rmesa->hw.vps.cmd)->vpu.count = 0;
|
||||
|
||||
setup_vertex_shader_fragment(rmesa, VSF_DEST_PROGRAM, &(prog->program));
|
||||
|
||||
#if 0
|
||||
setup_vertex_shader_fragment(rmesa, VSF_DEST_UNKNOWN1,
|
||||
&(rmesa->state.vertex_shader.unknown1));
|
||||
setup_vertex_shader_fragment(rmesa, VSF_DEST_UNKNOWN2,
|
||||
&(rmesa->state.vertex_shader.unknown2));
|
||||
#endif
|
||||
|
||||
inst_count = prog->program.length / 4 - 1;
|
||||
|
||||
R300_STATECHANGE(rmesa, pvs);
|
||||
rmesa->hw.pvs.cmd[R300_PVS_CNTL_1] =
|
||||
(0 << R300_PVS_CNTL_1_PROGRAM_START_SHIFT)
|
||||
| (inst_count /*pos_end */ << R300_PVS_CNTL_1_POS_END_SHIFT)
|
||||
| (inst_count << R300_PVS_CNTL_1_PROGRAM_END_SHIFT);
|
||||
rmesa->hw.pvs.cmd[R300_PVS_CNTL_2] =
|
||||
(0 << R300_PVS_CNTL_2_PARAM_OFFSET_SHIFT)
|
||||
| (param_count << R300_PVS_CNTL_2_PARAM_COUNT_SHIFT);
|
||||
rmesa->hw.pvs.cmd[R300_PVS_CNTL_3] =
|
||||
(0 /*rmesa->state.vertex_shader.unknown_ptr2 */ <<
|
||||
R300_PVS_CNTL_3_PROGRAM_UNKNOWN_SHIFT)
|
||||
| (inst_count /*rmesa->state.vertex_shader.unknown_ptr3 */ <<
|
||||
0);
|
||||
|
||||
/* This is done for vertex shader fragments, but also needs to be done for vap_pvs,
|
||||
so I leave it as a reminder */
|
||||
#if 0
|
||||
reg_start(R300_VAP_PVS_WAITIDLE, 0);
|
||||
e32(0x00000000);
|
||||
#endif
|
||||
}
|
||||
|
||||
extern void _tnl_UpdateFixedFunctionProgram(GLcontext * ctx);
|
||||
|
||||
extern int future_hw_tcl_on;
|
||||
void r300UpdateShaders(r300ContextPtr rmesa)
|
||||
{
|
||||
GLcontext *ctx;
|
||||
struct r300_vertex_program *vp;
|
||||
int i;
|
||||
|
||||
ctx = rmesa->radeon.glCtx;
|
||||
|
||||
if (rmesa->NewGLState && hw_tcl_on) {
|
||||
rmesa->NewGLState = 0;
|
||||
|
||||
for (i = _TNL_FIRST_MAT; i <= _TNL_LAST_MAT; i++) {
|
||||
rmesa->temp_attrib[i] =
|
||||
TNL_CONTEXT(ctx)->vb.AttribPtr[i];
|
||||
TNL_CONTEXT(ctx)->vb.AttribPtr[i] =
|
||||
&rmesa->dummy_attrib[i];
|
||||
}
|
||||
|
||||
_tnl_UpdateFixedFunctionProgram(ctx);
|
||||
|
||||
for (i = _TNL_FIRST_MAT; i <= _TNL_LAST_MAT; i++) {
|
||||
TNL_CONTEXT(ctx)->vb.AttribPtr[i] =
|
||||
rmesa->temp_attrib[i];
|
||||
}
|
||||
|
||||
r300SelectVertexShader(rmesa);
|
||||
vp = (struct r300_vertex_program *)
|
||||
CURRENT_VERTEX_SHADER(ctx);
|
||||
/*if (vp->translated == GL_FALSE)
|
||||
r300TranslateVertexShader(vp); */
|
||||
if (vp->translated == GL_FALSE) {
|
||||
fprintf(stderr, "Failing back to sw-tcl\n");
|
||||
hw_tcl_on = future_hw_tcl_on = 0;
|
||||
r300ResetHwState(rmesa);
|
||||
|
||||
return;
|
||||
}
|
||||
r300UpdateStateParameters(ctx, _NEW_PROGRAM);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void r300SetupPixelShader(r300ContextPtr rmesa)
|
||||
{
|
||||
GLcontext *ctx = rmesa->radeon.glCtx;
|
||||
struct r300_fragment_program *fp = (struct r300_fragment_program *)
|
||||
(char *)ctx->FragmentProgram._Current;
|
||||
int i, k;
|
||||
|
||||
if (!fp) /* should only happenen once, just after context is created */
|
||||
return;
|
||||
|
||||
r300TranslateFragmentShader(rmesa, fp);
|
||||
if (!fp->translated) {
|
||||
fprintf(stderr, "%s: No valid fragment shader, exiting\n",
|
||||
__FUNCTION__);
|
||||
return;
|
||||
}
|
||||
#define OUTPUT_FIELD(st, reg, field) \
|
||||
R300_STATECHANGE(rmesa, st); \
|
||||
for(i=0;i<=fp->alu_end;i++) \
|
||||
rmesa->hw.st.cmd[R300_FPI_INSTR_0+i]=fp->alu.inst[i].field;\
|
||||
rmesa->hw.st.cmd[R300_FPI_CMD_0]=cmdpacket0(reg, fp->alu_end+1);
|
||||
|
||||
OUTPUT_FIELD(fpi[0], R300_PFS_INSTR0_0, inst0);
|
||||
OUTPUT_FIELD(fpi[1], R300_PFS_INSTR1_0, inst1);
|
||||
OUTPUT_FIELD(fpi[2], R300_PFS_INSTR2_0, inst2);
|
||||
OUTPUT_FIELD(fpi[3], R300_PFS_INSTR3_0, inst3);
|
||||
#undef OUTPUT_FIELD
|
||||
|
||||
R300_STATECHANGE(rmesa, fp);
|
||||
/* I just want to say, the way these nodes are stored.. weird.. */
|
||||
for (i = 0, k = (4 - (fp->cur_node + 1)); i < 4; i++, k++) {
|
||||
if (i < (fp->cur_node + 1)) {
|
||||
rmesa->hw.fp.cmd[R300_FP_NODE0 + k] =
|
||||
(fp->node[i].
|
||||
alu_offset << R300_PFS_NODE_ALU_OFFSET_SHIFT)
|
||||
| (fp->node[i].
|
||||
alu_end << R300_PFS_NODE_ALU_END_SHIFT)
|
||||
| (fp->node[i].
|
||||
tex_offset << R300_PFS_NODE_TEX_OFFSET_SHIFT)
|
||||
| (fp->node[i].
|
||||
tex_end << R300_PFS_NODE_TEX_END_SHIFT)
|
||||
| fp->node[i].flags; /* ( (k==3) ? R300_PFS_NODE_LAST_NODE : 0); */
|
||||
} else {
|
||||
rmesa->hw.fp.cmd[R300_FP_NODE0 + (3 - i)] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* PFS_CNTL_0 */
|
||||
rmesa->hw.fp.cmd[R300_FP_CNTL0] =
|
||||
fp->cur_node | (fp->first_node_has_tex << 3);
|
||||
/* PFS_CNTL_1 */
|
||||
rmesa->hw.fp.cmd[R300_FP_CNTL1] = fp->max_temp_idx;
|
||||
/* PFS_CNTL_2 */
|
||||
rmesa->hw.fp.cmd[R300_FP_CNTL2] =
|
||||
(fp->alu_offset << R300_PFS_CNTL_ALU_OFFSET_SHIFT)
|
||||
| (fp->alu_end << R300_PFS_CNTL_ALU_END_SHIFT)
|
||||
| (fp->tex_offset << R300_PFS_CNTL_TEX_OFFSET_SHIFT)
|
||||
| (fp->tex_end << R300_PFS_CNTL_TEX_END_SHIFT);
|
||||
|
||||
R300_STATECHANGE(rmesa, fpp);
|
||||
for (i = 0; i < fp->const_nr; i++) {
|
||||
rmesa->hw.fpp.cmd[R300_FPP_PARAM_0 + 4 * i + 0] =
|
||||
r300PackFloat24(fp->constant[i][0]);
|
||||
rmesa->hw.fpp.cmd[R300_FPP_PARAM_0 + 4 * i + 1] =
|
||||
r300PackFloat24(fp->constant[i][1]);
|
||||
rmesa->hw.fpp.cmd[R300_FPP_PARAM_0 + 4 * i + 2] =
|
||||
r300PackFloat24(fp->constant[i][2]);
|
||||
rmesa->hw.fpp.cmd[R300_FPP_PARAM_0 + 4 * i + 3] =
|
||||
r300PackFloat24(fp->constant[i][3]);
|
||||
}
|
||||
rmesa->hw.fpp.cmd[R300_FPP_CMD_0] =
|
||||
cmdpacket0(R300_PFS_PARAM_0_X, fp->const_nr * 4);
|
||||
}
|
||||
|
||||
void r300UpdateShaderStates(r300ContextPtr rmesa)
|
||||
{
|
||||
GLcontext *ctx;
|
||||
ctx = rmesa->radeon.glCtx;
|
||||
|
||||
r300UpdateTextureState(ctx);
|
||||
|
||||
r300SetupPixelShader(rmesa);
|
||||
r300SetupTextures(ctx);
|
||||
|
||||
if ((rmesa->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL))
|
||||
r300SetupVertexShader(rmesa);
|
||||
r300SetupRSUnit(ctx);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by Mesa after an internal state update.
|
||||
*/
|
||||
static void r300InvalidateState(GLcontext * ctx, GLuint new_state)
|
||||
{
|
||||
r300ContextPtr r300 = R300_CONTEXT(ctx);
|
||||
|
||||
_swrast_InvalidateState(ctx, new_state);
|
||||
_swsetup_InvalidateState(ctx, new_state);
|
||||
_vbo_InvalidateState(ctx, new_state);
|
||||
_tnl_InvalidateState(ctx, new_state);
|
||||
_ae_invalidate_state(ctx, new_state);
|
||||
|
||||
if (new_state & (_NEW_BUFFERS | _NEW_COLOR | _NEW_PIXEL)) {
|
||||
r300UpdateDrawBuffer(ctx);
|
||||
}
|
||||
|
||||
r300UpdateStateParameters(ctx, new_state);
|
||||
|
||||
r300->NewGLState |= new_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* Completely recalculates hardware state based on the Mesa state.
|
||||
*/
|
||||
void r300ResetHwState(r300ContextPtr r300)
|
||||
static void r300ResetHwState(r300ContextPtr r300)
|
||||
{
|
||||
GLcontext *ctx = r300->radeon.glCtx;
|
||||
int has_tcl = 1;
|
||||
|
|
@ -2232,6 +2074,163 @@ void r300ResetHwState(r300ContextPtr r300)
|
|||
r300->hw.all_dirty = GL_TRUE;
|
||||
}
|
||||
|
||||
|
||||
extern void _tnl_UpdateFixedFunctionProgram(GLcontext * ctx);
|
||||
|
||||
extern int future_hw_tcl_on;
|
||||
void r300UpdateShaders(r300ContextPtr rmesa)
|
||||
{
|
||||
GLcontext *ctx;
|
||||
struct r300_vertex_program *vp;
|
||||
int i;
|
||||
|
||||
ctx = rmesa->radeon.glCtx;
|
||||
|
||||
if (rmesa->NewGLState && hw_tcl_on) {
|
||||
rmesa->NewGLState = 0;
|
||||
|
||||
for (i = _TNL_FIRST_MAT; i <= _TNL_LAST_MAT; i++) {
|
||||
rmesa->temp_attrib[i] =
|
||||
TNL_CONTEXT(ctx)->vb.AttribPtr[i];
|
||||
TNL_CONTEXT(ctx)->vb.AttribPtr[i] =
|
||||
&rmesa->dummy_attrib[i];
|
||||
}
|
||||
|
||||
_tnl_UpdateFixedFunctionProgram(ctx);
|
||||
|
||||
for (i = _TNL_FIRST_MAT; i <= _TNL_LAST_MAT; i++) {
|
||||
TNL_CONTEXT(ctx)->vb.AttribPtr[i] =
|
||||
rmesa->temp_attrib[i];
|
||||
}
|
||||
|
||||
r300SelectVertexShader(rmesa);
|
||||
vp = (struct r300_vertex_program *)
|
||||
CURRENT_VERTEX_SHADER(ctx);
|
||||
/*if (vp->translated == GL_FALSE)
|
||||
r300TranslateVertexShader(vp); */
|
||||
if (vp->translated == GL_FALSE) {
|
||||
fprintf(stderr, "Failing back to sw-tcl\n");
|
||||
hw_tcl_on = future_hw_tcl_on = 0;
|
||||
r300ResetHwState(rmesa);
|
||||
|
||||
return;
|
||||
}
|
||||
r300UpdateStateParameters(ctx, _NEW_PROGRAM);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void r300SetupPixelShader(r300ContextPtr rmesa)
|
||||
{
|
||||
GLcontext *ctx = rmesa->radeon.glCtx;
|
||||
struct r300_fragment_program *fp = (struct r300_fragment_program *)
|
||||
(char *)ctx->FragmentProgram._Current;
|
||||
int i, k;
|
||||
|
||||
if (!fp) /* should only happenen once, just after context is created */
|
||||
return;
|
||||
|
||||
r300TranslateFragmentShader(rmesa, fp);
|
||||
if (!fp->translated) {
|
||||
fprintf(stderr, "%s: No valid fragment shader, exiting\n",
|
||||
__FUNCTION__);
|
||||
return;
|
||||
}
|
||||
#define OUTPUT_FIELD(st, reg, field) \
|
||||
R300_STATECHANGE(rmesa, st); \
|
||||
for(i=0;i<=fp->alu_end;i++) \
|
||||
rmesa->hw.st.cmd[R300_FPI_INSTR_0+i]=fp->alu.inst[i].field;\
|
||||
rmesa->hw.st.cmd[R300_FPI_CMD_0]=cmdpacket0(reg, fp->alu_end+1);
|
||||
|
||||
OUTPUT_FIELD(fpi[0], R300_PFS_INSTR0_0, inst0);
|
||||
OUTPUT_FIELD(fpi[1], R300_PFS_INSTR1_0, inst1);
|
||||
OUTPUT_FIELD(fpi[2], R300_PFS_INSTR2_0, inst2);
|
||||
OUTPUT_FIELD(fpi[3], R300_PFS_INSTR3_0, inst3);
|
||||
#undef OUTPUT_FIELD
|
||||
|
||||
R300_STATECHANGE(rmesa, fp);
|
||||
/* I just want to say, the way these nodes are stored.. weird.. */
|
||||
for (i = 0, k = (4 - (fp->cur_node + 1)); i < 4; i++, k++) {
|
||||
if (i < (fp->cur_node + 1)) {
|
||||
rmesa->hw.fp.cmd[R300_FP_NODE0 + k] =
|
||||
(fp->node[i].
|
||||
alu_offset << R300_PFS_NODE_ALU_OFFSET_SHIFT)
|
||||
| (fp->node[i].
|
||||
alu_end << R300_PFS_NODE_ALU_END_SHIFT)
|
||||
| (fp->node[i].
|
||||
tex_offset << R300_PFS_NODE_TEX_OFFSET_SHIFT)
|
||||
| (fp->node[i].
|
||||
tex_end << R300_PFS_NODE_TEX_END_SHIFT)
|
||||
| fp->node[i].flags; /* ( (k==3) ? R300_PFS_NODE_LAST_NODE : 0); */
|
||||
} else {
|
||||
rmesa->hw.fp.cmd[R300_FP_NODE0 + (3 - i)] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* PFS_CNTL_0 */
|
||||
rmesa->hw.fp.cmd[R300_FP_CNTL0] =
|
||||
fp->cur_node | (fp->first_node_has_tex << 3);
|
||||
/* PFS_CNTL_1 */
|
||||
rmesa->hw.fp.cmd[R300_FP_CNTL1] = fp->max_temp_idx;
|
||||
/* PFS_CNTL_2 */
|
||||
rmesa->hw.fp.cmd[R300_FP_CNTL2] =
|
||||
(fp->alu_offset << R300_PFS_CNTL_ALU_OFFSET_SHIFT)
|
||||
| (fp->alu_end << R300_PFS_CNTL_ALU_END_SHIFT)
|
||||
| (fp->tex_offset << R300_PFS_CNTL_TEX_OFFSET_SHIFT)
|
||||
| (fp->tex_end << R300_PFS_CNTL_TEX_END_SHIFT);
|
||||
|
||||
R300_STATECHANGE(rmesa, fpp);
|
||||
for (i = 0; i < fp->const_nr; i++) {
|
||||
rmesa->hw.fpp.cmd[R300_FPP_PARAM_0 + 4 * i + 0] =
|
||||
r300PackFloat24(fp->constant[i][0]);
|
||||
rmesa->hw.fpp.cmd[R300_FPP_PARAM_0 + 4 * i + 1] =
|
||||
r300PackFloat24(fp->constant[i][1]);
|
||||
rmesa->hw.fpp.cmd[R300_FPP_PARAM_0 + 4 * i + 2] =
|
||||
r300PackFloat24(fp->constant[i][2]);
|
||||
rmesa->hw.fpp.cmd[R300_FPP_PARAM_0 + 4 * i + 3] =
|
||||
r300PackFloat24(fp->constant[i][3]);
|
||||
}
|
||||
rmesa->hw.fpp.cmd[R300_FPP_CMD_0] =
|
||||
cmdpacket0(R300_PFS_PARAM_0_X, fp->const_nr * 4);
|
||||
}
|
||||
|
||||
void r300UpdateShaderStates(r300ContextPtr rmesa)
|
||||
{
|
||||
GLcontext *ctx;
|
||||
ctx = rmesa->radeon.glCtx;
|
||||
|
||||
r300UpdateTextureState(ctx);
|
||||
|
||||
r300SetupPixelShader(rmesa);
|
||||
r300SetupTextures(ctx);
|
||||
|
||||
if ((rmesa->radeon.radeonScreen->chip_flags & RADEON_CHIPSET_TCL))
|
||||
r300SetupVertexShader(rmesa);
|
||||
r300SetupRSUnit(ctx);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called by Mesa after an internal state update.
|
||||
*/
|
||||
static void r300InvalidateState(GLcontext * ctx, GLuint new_state)
|
||||
{
|
||||
r300ContextPtr r300 = R300_CONTEXT(ctx);
|
||||
|
||||
_swrast_InvalidateState(ctx, new_state);
|
||||
_swsetup_InvalidateState(ctx, new_state);
|
||||
_vbo_InvalidateState(ctx, new_state);
|
||||
_tnl_InvalidateState(ctx, new_state);
|
||||
_ae_invalidate_state(ctx, new_state);
|
||||
|
||||
if (new_state & (_NEW_BUFFERS | _NEW_COLOR | _NEW_PIXEL)) {
|
||||
r300UpdateDrawBuffer(ctx);
|
||||
}
|
||||
|
||||
r300UpdateStateParameters(ctx, new_state);
|
||||
|
||||
r300->NewGLState |= new_state;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate initial hardware state and register state functions.
|
||||
* Assumes that the command buffer and state atoms have been
|
||||
|
|
|
|||
|
|
@ -58,20 +58,13 @@ do { \
|
|||
\
|
||||
} while (0)
|
||||
|
||||
extern void r300ResetHwState(r300ContextPtr r300);
|
||||
|
||||
extern void r300UpdateStateParameters(GLcontext * ctx, GLuint new_state);
|
||||
extern void r300InitState(r300ContextPtr r300);
|
||||
extern void r300InitStateFuncs(struct dd_function_table *functions);
|
||||
extern void r300UpdateViewportOffset(GLcontext * ctx);
|
||||
extern void r300UpdateWindow(GLcontext * ctx);
|
||||
extern void r300UpdateDrawBuffer(GLcontext * ctx);
|
||||
extern void r300SetupVertexShader(r300ContextPtr rmesa);
|
||||
|
||||
extern void r300UpdateShaders(r300ContextPtr rmesa);
|
||||
extern void r300UpdateShaderStates(r300ContextPtr rmesa);
|
||||
|
||||
extern void r300PrintStateAtom(r300ContextPtr r300,
|
||||
struct r300_state_atom *state);
|
||||
|
||||
#endif /* __R300_STATE_H__ */
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue