Port viewport setting code from R200.

Take it outside R300ResetHwState.
This commit is contained in:
Vladimir Dergachev 2004-12-30 06:06:54 +00:00
parent 5be14fd59a
commit 74bf43051c
3 changed files with 85 additions and 20 deletions

View File

@ -308,7 +308,13 @@ struct r300_cmdbuf {
/**
* State cache
*/
struct r300_depthbuffer_state {
GLfloat scale;
};
struct r300_state {
struct r300_depthbuffer_state depth;
};
@ -321,6 +327,11 @@ struct r300_context {
struct r300_hw_state hw;
struct r300_cmdbuf cmdbuf;
struct r300_state state;
/* Vertex buffers */
int elt_count; /* size of the buffer for vertices */
int attrib_count; /* size of the buffer for vertex attributes.. Somehow it can be different ? */
};
#define R300_CONTEXT(ctx) ((r300ContextPtr)(ctx->DriverCtx))

View File

@ -225,6 +225,58 @@ static void r300ColorMask(GLcontext* ctx,
}
}
/* =============================================================
* Window position and viewport transformation
*/
/*
* To correctly position primitives:
*/
#define SUBPIXEL_X 0.125
#define SUBPIXEL_Y 0.125
void r300UpdateWindow(GLcontext * ctx)
{
r300ContextPtr rmesa = R300_CONTEXT(ctx);
__DRIdrawablePrivate *dPriv = rmesa->radeon.dri.drawable;
GLfloat xoffset = dPriv ? (GLfloat) dPriv->x : 0;
GLfloat yoffset = dPriv ? (GLfloat) dPriv->y + dPriv->h : 0;
const GLfloat *v = ctx->Viewport._WindowMap.m;
GLfloat sx = v[MAT_SX];
GLfloat tx = v[MAT_TX] + xoffset + SUBPIXEL_X;
GLfloat sy = -v[MAT_SY];
GLfloat ty = (-v[MAT_TY]) + yoffset + SUBPIXEL_Y;
GLfloat sz = v[MAT_SZ] * rmesa->state.depth.scale;
GLfloat tz = v[MAT_TZ] * rmesa->state.depth.scale;
R300_FIREVERTICES(rmesa);
R300_STATECHANGE(rmesa, vpt);
rmesa->hw.vpt.cmd[R300_VPT_XSCALE] = r300PackFloat32(sx);
rmesa->hw.vpt.cmd[R300_VPT_XOFFSET] = r300PackFloat32(tx);
rmesa->hw.vpt.cmd[R300_VPT_YSCALE] = r300PackFloat32(sy);
rmesa->hw.vpt.cmd[R300_VPT_YOFFSET] = r300PackFloat32(ty);
rmesa->hw.vpt.cmd[R300_VPT_ZSCALE] = r300PackFloat32(sz);
rmesa->hw.vpt.cmd[R300_VPT_ZOFFSET] = r300PackFloat32(tz);
}
static void r300Viewport(GLcontext * ctx, GLint x, GLint y,
GLsizei width, GLsizei height)
{
/* Don't pipeline viewport changes, conflict with window offset
* setting below. Could apply deltas to rescue pipelined viewport
* values, or keep the originals hanging around.
*/
R200_FIREVERTICES(R200_CONTEXT(ctx));
r300UpdateWindow(ctx);
}
static void r300DepthRange(GLcontext * ctx, GLclampd nearval, GLclampd farval)
{
r300UpdateWindow(ctx);
}
/**
* Called by Mesa after an internal state update.
@ -255,26 +307,8 @@ void r300ResetHwState(r300ContextPtr r300)
if (RADEON_DEBUG & DEBUG_STATE)
fprintf(stderr, "%s\n", __FUNCTION__);
{
__DRIdrawablePrivate *dPriv = r300->radeon.dri.drawable;
GLfloat xoffset = dPriv ? (GLfloat) dPriv->x : 0;
GLfloat yoffset = dPriv ? (GLfloat) dPriv->y + dPriv->h : 0;
const GLfloat *v = ctx->Viewport._WindowMap.m;
r300->hw.vpt.cmd[R300_VPT_XSCALE] =
r300PackFloat32(v[MAT_SX]);
r300->hw.vpt.cmd[R300_VPT_XOFFSET] =
r300PackFloat32(v[MAT_TX] + xoffset);
r300->hw.vpt.cmd[R300_VPT_YSCALE] =
r300PackFloat32(-v[MAT_SY]);
r300->hw.vpt.cmd[R300_VPT_YOFFSET] =
r300PackFloat32(-v[MAT_TY] + yoffset);
r300->hw.vpt.cmd[R300_VPT_ZSCALE] =
r300PackFloat32(v[MAT_SZ]);
r300->hw.vpt.cmd[R300_VPT_ZOFFSET] =
r300PackFloat32(v[MAT_TZ]);
}
r300UpdateWindow(ctx);
r300ColorMask(ctx,
ctx->Color.ColorMask[RCOMP],
ctx->Color.ColorMask[GCOMP],
@ -504,11 +538,14 @@ void r300ResetHwState(r300ContextPtr r300)
void r300InitState(r300ContextPtr r300)
{
radeonInitState(&r300->radeon);
r300->state.depth.scale = 1.0 / (GLfloat) 0xffff;
r300ResetHwState(r300);
}
/**
* Initialize driver's state callback functions
*/
@ -523,5 +560,9 @@ void r300InitStateFuncs(struct dd_function_table* functions)
functions->DepthMask = r300DepthMask;
functions->CullFace = r300CullFace;
functions->FrontFace = r300FrontFace;
/* Viewport related */
functions->Viewport = r300Viewport;
functions->DepthRange = r300DepthRange;
}

View File

@ -43,6 +43,19 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
r300->hw.is_dirty = GL_TRUE; \
} while(0)
/* Fire the buffered vertices no matter what.
TODO: This has not been implemented yet
*/
#define R300_FIREVERTICES( r300 ) \
do { \
/* \
if ( (r300)->store.cmd_used || (r300)->dma.flush ) { \
radeonFlush( (r300)->radeon.glCtx ); \
} \
*/ \
} while (0)
extern void r300ResetHwState(r300ContextPtr r300);
extern void r300InitState(r300ContextPtr r300);