nouveau: nv10: fix viewport scale and origin

This commit is contained in:
Patrice Mandin 2007-02-16 19:46:54 +01:00
parent e4c772bead
commit 252d1de054
1 changed files with 33 additions and 12 deletions

View File

@ -34,6 +34,29 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "mtypes.h"
#include "colormac.h"
static void nv10ViewportScale(nouveauContextPtr nmesa)
{
GLcontext *ctx = nmesa->glCtx;
GLuint w = ctx->Viewport.Width;
GLuint h = ctx->Viewport.Height;
GLfloat max_depth = (ctx->Viewport.Near + ctx->Viewport.Far) * 0.5;
switch (ctx->DrawBuffer->_DepthBuffer->DepthBits) {
case 16:
max_depth *= 32767.0;
break;
case 24:
max_depth *= 16777215.0;
break;
}
BEGIN_RING_CACHE(NvSub3D, NV10_TCL_PRIMITIVE_3D_VIEWPORT_SCALE_X, 4);
OUT_RING_CACHEf ((((GLfloat) w) * 0.5) - 2048.0);
OUT_RING_CACHEf ((((GLfloat) h) * 0.5) - 2048.0);
OUT_RING_CACHEf (max_depth);
OUT_RING_CACHEf (0.0);
}
static void nv10AlphaFunc(GLcontext *ctx, GLenum func, GLfloat ref)
{
nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
@ -167,6 +190,8 @@ static void nv10DepthRange(GLcontext *ctx, GLclampd nearval, GLclampd farval)
BEGIN_RING_CACHE(NvSub3D, NV10_TCL_PRIMITIVE_3D_DEPTH_RANGE_NEAR, 2);
OUT_RING_CACHEf(nearval);
OUT_RING_CACHEf(farval);
nv10ViewportScale(nmesa);
}
/** Specify the current buffer for writing */
@ -628,18 +653,7 @@ static void nv10WindowMoved(nouveauContextPtr nmesa)
OUT_RING_CACHE(0);
}
/* viewport transform */
BEGIN_RING_CACHE(NvSub3D, NV10_TCL_PRIMITIVE_3D_VIEWPORT_ORIGIN_X, 4);
OUT_RING_CACHEf ((GLfloat) x);
OUT_RING_CACHEf ((GLfloat) (y+h));
OUT_RING_CACHEf (0.0);
OUT_RING_CACHEf (0.0);
BEGIN_RING_CACHE(NvSub3D, NV10_TCL_PRIMITIVE_3D_VIEWPORT_SCALE_X, 4);
OUT_RING_CACHEf ((((GLfloat) w) * 0.5) - 2048.0);
OUT_RING_CACHEf ((((GLfloat) h) * 0.5) - 2048.0);
OUT_RING_CACHEf (16777215.0 * 0.5);
OUT_RING_CACHEf (0.0);
nv10ViewportScale(nmesa);
}
/* Initialise any card-specific non-GL related state */
@ -700,6 +714,13 @@ static GLboolean nv10BindBuffers(nouveauContextPtr nmesa, int num_color,
OUT_RING_CACHE(color[0]->offset);
OUT_RING_CACHE(depth ? depth->offset : color[0]->offset);
/* Always set to bottom left of buffer */
BEGIN_RING_CACHE(NvSub3D, NV10_TCL_PRIMITIVE_3D_VIEWPORT_ORIGIN_X, 4);
OUT_RING_CACHEf (0.0);
OUT_RING_CACHEf ((GLfloat) h);
OUT_RING_CACHEf (0.0);
OUT_RING_CACHEf (0.0);
return GL_TRUE;
}