r600: add user clip plane support

This commit is contained in:
Alex Deucher
2009-07-20 17:22:59 -04:00
parent ce9c5a1a27
commit a369963b18
3 changed files with 56 additions and 2 deletions
+22
View File
@@ -722,3 +722,25 @@ GLboolean r700SendSQConfig(context_t *context)
return GL_TRUE;
}
GLboolean r700SendUCPState(context_t *context)
{
R700_CHIP_CONTEXT *r700 = R700_CONTEXT_STATES(context);
BATCH_LOCALS(&context->radeon);
int i;
for (i = 0; i < R700_MAX_UCP; i++) {
if (r700->ucp[i].enabled) {
BEGIN_BATCH_NO_AUTOSTATE(6);
R600_OUT_BATCH_REGSEQ(PA_CL_UCP_0_X + (16 * i), 4);
R600_OUT_BATCH(r700->ucp[i].PA_CL_UCP_0_X.u32All);
R600_OUT_BATCH(r700->ucp[i].PA_CL_UCP_0_Y.u32All);
R600_OUT_BATCH(r700->ucp[i].PA_CL_UCP_0_Z.u32All);
R600_OUT_BATCH(r700->ucp[i].PA_CL_UCP_0_W.u32All);
END_BATCH();
COMMIT_BATCH();
}
}
return GL_TRUE;
}
+1
View File
@@ -322,6 +322,7 @@ static GLboolean r700RunRender(GLcontext * ctx,
r700SendPSState(context);
r700SendVSState(context);
r700SendUCPState(context);
r700SendContextStates(context);
r700SendViewportState(context, 0);
r700SendRenderTargetState(context, 0);
+33 -2
View File
@@ -56,6 +56,8 @@
#include "r700_vertprog.h"
static void r700SetClipPlaneState(GLcontext * ctx, GLenum cap, GLboolean state);
void r700SetDefaultStates(context_t *context) //--------------------
{
@@ -446,7 +448,7 @@ static void r700Enable(GLcontext * ctx, GLenum cap, GLboolean state) //---------
case GL_CLIP_PLANE3:
case GL_CLIP_PLANE4:
case GL_CLIP_PLANE5:
//r700SetClipPlaneState(ctx, cap, state);
r700SetClipPlaneState(ctx, cap, state);
break;
case GL_DEPTH_TEST:
r700SetDepthState(ctx);
@@ -675,8 +677,37 @@ static void r700RenderMode(GLcontext * ctx, GLenum mode) //---------------------
{
}
static void r700ClipPlane( GLcontext *ctx, GLenum plane, const GLfloat *eq ) //-----------------
static void r700ClipPlane( GLcontext *ctx, GLenum plane, const GLfloat *eq )
{
context_t *context = R700_CONTEXT(ctx);
R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
GLint p;
GLint *ip;
p = (GLint) plane - (GLint) GL_CLIP_PLANE0;
ip = (GLint *)ctx->Transform._ClipUserPlane[p];
r700->ucp[p].PA_CL_UCP_0_X.u32All = ip[0];
r700->ucp[p].PA_CL_UCP_0_Y.u32All = ip[1];
r700->ucp[p].PA_CL_UCP_0_Z.u32All = ip[2];
r700->ucp[p].PA_CL_UCP_0_W.u32All = ip[3];
}
static void r700SetClipPlaneState(GLcontext * ctx, GLenum cap, GLboolean state)
{
context_t *context = R700_CONTEXT(ctx);
R700_CHIP_CONTEXT *r700 = (R700_CHIP_CONTEXT*)(&context->hw);
GLuint p;
p = cap - GL_CLIP_PLANE0;
if (state) {
r700->PA_CL_CLIP_CNTL.u32All |= (UCP_ENA_0_bit << p);
r700->ucp[p].enabled = GL_TRUE;
r700ClipPlane(ctx, cap, NULL);
} else {
r700->PA_CL_CLIP_CNTL.u32All &= ~(UCP_ENA_0_bit << p);
r700->ucp[p].enabled = GL_FALSE;
}
}
void r700SetScissor(context_t *context) //---------------