mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 05:08:08 +02:00
Merge branch 'softpipe_0_1_branch' of git+ssh://brianp@git.freedesktop.org/git/mesa/mesa into softpipe_0_1_branch
This commit is contained in:
commit
5b737b7df2
66 changed files with 1716 additions and 1152 deletions
|
|
@ -1053,6 +1053,7 @@ main (int argc, char *argv[])
|
|||
else
|
||||
file = argv[1];
|
||||
|
||||
glutInit(&argc, argv);
|
||||
glutInitWindowPosition (0, 0);
|
||||
glutInitWindowSize(640,480);
|
||||
glutInitDisplayMode (GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE );
|
||||
|
|
|
|||
|
|
@ -569,6 +569,7 @@ main(int ac, char **av)
|
|||
if (ac == 2)
|
||||
frontbuffer = 0;
|
||||
|
||||
glutInit(&ac, av);
|
||||
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
|
||||
glutInitWindowPosition(0, 0);
|
||||
glutInitWindowSize(640, 480);
|
||||
|
|
|
|||
|
|
@ -1042,6 +1042,7 @@ int main(int argc, char **argv)
|
|||
|
||||
read_surface( "isosurf.dat" );
|
||||
|
||||
glutInit( &argc, argv);
|
||||
glutInitWindowPosition(0, 0);
|
||||
glutInitWindowSize(400, 400);
|
||||
|
||||
|
|
|
|||
|
|
@ -826,7 +826,7 @@ static void pinit(void)
|
|||
|
||||
}
|
||||
|
||||
static void INIT(void)
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
printf("Morph 3D - Shows morphing platonic polyhedra\n");
|
||||
printf("Author: Marcelo Fernandes Vianna (vianna@cat.cbpf.br)\n\n");
|
||||
|
|
@ -841,6 +841,7 @@ static void INIT(void)
|
|||
|
||||
object=1;
|
||||
|
||||
glutInit(&argc, argv);
|
||||
glutInitWindowPosition(0,0);
|
||||
glutInitWindowSize(640,480);
|
||||
|
||||
|
|
@ -888,9 +889,3 @@ static void INIT(void)
|
|||
glutMainLoop();
|
||||
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
INIT();
|
||||
return(0);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -100,6 +100,7 @@ static void init( void )
|
|||
|
||||
int main( int argc, char *argv[] )
|
||||
{
|
||||
glutInit(&argc, argv);
|
||||
glutInitWindowPosition(0, 0);
|
||||
glutInitWindowSize(500, 500);
|
||||
glutInitDisplayMode( GLUT_RGB );
|
||||
|
|
|
|||
|
|
@ -71,12 +71,12 @@ typedef Vertex Quad[4];
|
|||
|
||||
/* data to define the six faces of a unit cube */
|
||||
Quad quads[MAXQUAD] = {
|
||||
{ {0,0,0}, {1,0,0}, {1,1,0}, {0,1,0} },
|
||||
{ {0,0,1}, {1,0,1}, {1,1,1}, {0,1,1} },
|
||||
{ {0,0,0}, {1,0,0}, {1,0,1}, {0,0,1} },
|
||||
{ {0,1,0}, {1,1,0}, {1,1,1}, {0,1,1} },
|
||||
{ {0,0,0}, {0,0,1}, {0,1,1}, {0,1,0} },
|
||||
{ {1,0,0}, {1,0,1}, {1,1,1}, {1,1,0} }
|
||||
{ {0,0,0}, {0,0,1}, {0,1,1}, {0,1,0} }, /* x = 0 */
|
||||
{ {0,0,0}, {1,0,0}, {1,0,1}, {0,0,1} }, /* y = 0 */
|
||||
{ {0,0,0}, {1,0,0}, {1,1,0}, {0,1,0} }, /* z = 0 */
|
||||
{ {1,0,0}, {1,0,1}, {1,1,1}, {1,1,0} }, /* x = 1 */
|
||||
{ {0,1,0}, {1,1,0}, {1,1,1}, {0,1,1} }, /* y = 1 */
|
||||
{ {0,0,1}, {1,0,1}, {1,1,1}, {0,1,1} } /* z = 1 */
|
||||
};
|
||||
|
||||
#define WIREFRAME 0
|
||||
|
|
@ -86,7 +86,7 @@ static void error(const char* prog, const char* msg);
|
|||
static void cubes(int mx, int my, int mode);
|
||||
static void fill(Quad quad);
|
||||
static void outline(Quad quad);
|
||||
static void draw_hidden(Quad quad, int mode);
|
||||
static void draw_hidden(Quad quad, int mode, int face);
|
||||
static void process_input(Display *dpy, Window win);
|
||||
static int query_extension(char* extName);
|
||||
|
||||
|
|
@ -101,6 +101,7 @@ int main(int argc, char** argv) {
|
|||
XSetWindowAttributes swa;
|
||||
Window win;
|
||||
GLXContext cx;
|
||||
GLint z;
|
||||
|
||||
dpy = XOpenDisplay(0);
|
||||
if (!dpy) error(argv[0], "can't open display");
|
||||
|
|
@ -134,13 +135,16 @@ int main(int argc, char** argv) {
|
|||
|
||||
/* set up viewing parameters */
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
gluPerspective(20, 1, 0.1, 20);
|
||||
gluPerspective(20, 1, 10, 20);
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glTranslatef(0, 0, -15);
|
||||
|
||||
/* set other relevant state information */
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
|
||||
glGetIntegerv(GL_DEPTH_BITS, &z);
|
||||
printf("GL_DEPTH_BITS = %d\n", z);
|
||||
|
||||
#ifdef GL_EXT_polygon_offset
|
||||
printf("using 1.0 offset extension\n");
|
||||
glPolygonOffsetEXT( 1.0, 0.00001 );
|
||||
|
|
@ -160,6 +164,7 @@ int main(int argc, char** argv) {
|
|||
|
||||
static void
|
||||
draw_scene(int mx, int my) {
|
||||
glClearColor(0.25, 0.25, 0.25, 0);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
glPushMatrix();
|
||||
|
|
@ -206,7 +211,7 @@ cubes(int mx, int my, int mode) {
|
|||
glTranslatef(x, y, z);
|
||||
glScalef(0.8, 0.8, 0.8);
|
||||
for (i = 0; i < MAXQUAD; i++)
|
||||
draw_hidden(quads[i], mode);
|
||||
draw_hidden(quads[i], mode, i);
|
||||
glPopMatrix();
|
||||
}
|
||||
}
|
||||
|
|
@ -236,13 +241,18 @@ outline(Quad quad) {
|
|||
}
|
||||
|
||||
static void
|
||||
draw_hidden(Quad quad, int mode) {
|
||||
draw_hidden(Quad quad, int mode, int face) {
|
||||
static const GLfloat colors[3][3] = {
|
||||
{0.5, 0.5, 0.0},
|
||||
{0.8, 0.5, 0.0},
|
||||
{0.0, 0.5, 0.8}
|
||||
};
|
||||
if (mode == HIDDEN_LINE) {
|
||||
glColor3f(0, 0, 0);
|
||||
glColor3fv(colors[face % 3]);
|
||||
fill(quad);
|
||||
}
|
||||
|
||||
/* draw the outline using white, optionally fill the interior with black */
|
||||
/* draw the outline using white */
|
||||
glColor3f(1, 1, 1);
|
||||
outline(quad);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -428,10 +428,12 @@ __driUtilUpdateDrawableInfo(__DRIdrawablePrivate *pdp)
|
|||
|
||||
if (pdp->pClipRects) {
|
||||
_mesa_free(pdp->pClipRects);
|
||||
pdp->pClipRects = NULL;
|
||||
}
|
||||
|
||||
if (pdp->pBackClipRects) {
|
||||
_mesa_free(pdp->pBackClipRects);
|
||||
pdp->pBackClipRects = NULL;
|
||||
}
|
||||
|
||||
DRM_SPINUNLOCK(&psp->pSAREA->drawable_lock, psp->drawLockID);
|
||||
|
|
|
|||
|
|
@ -64,6 +64,7 @@ static void i915_reduced_primitive_state( intelContextPtr intel,
|
|||
st1 &= ~ST1_ENABLE;
|
||||
|
||||
switch (rprim) {
|
||||
case GL_QUADS: /* from RASTERIZE(GL_QUADS) in t_dd_tritemp.h */
|
||||
case GL_TRIANGLES:
|
||||
if (intel->ctx.Polygon.StippleFlag &&
|
||||
intel->hw_stipple)
|
||||
|
|
|
|||
|
|
@ -450,10 +450,16 @@ intelDrawPixels( GLcontext *ctx,
|
|||
* wise happily run the fragment program on each pixel in the image).
|
||||
*/
|
||||
struct gl_fragment_program *fpSave = ctx->FragmentProgram._Current;
|
||||
/* can't just set current frag prog to 0 here as on buffer resize
|
||||
we'll get new state checks which will segfault. Remains a hack. */
|
||||
ctx->FragmentProgram._Current = NULL;
|
||||
ctx->FragmentProgram._UseTexEnvProgram = GL_FALSE;
|
||||
ctx->FragmentProgram._Active = GL_FALSE;
|
||||
_swrast_DrawPixels( ctx, x, y, width, height, format, type,
|
||||
unpack, pixels );
|
||||
ctx->FragmentProgram._Current = fpSave;
|
||||
ctx->FragmentProgram._UseTexEnvProgram = GL_TRUE;
|
||||
ctx->FragmentProgram._Active = GL_TRUE;
|
||||
}
|
||||
else {
|
||||
_swrast_DrawPixels( ctx, x, y, width, height, format, type,
|
||||
|
|
|
|||
|
|
@ -61,6 +61,7 @@ i915_reduced_primitive_state(struct intel_context *intel, GLenum rprim)
|
|||
st1 &= ~ST1_ENABLE;
|
||||
|
||||
switch (rprim) {
|
||||
case GL_QUADS: /* from RASTERIZE(GL_QUADS) in t_dd_tritemp.h */
|
||||
case GL_TRIANGLES:
|
||||
if (intel->ctx.Polygon.StippleFlag && intel->hw_stipple)
|
||||
st1 |= ST1_ENABLE;
|
||||
|
|
@ -463,6 +464,7 @@ i915_state_draw_region(struct intel_context *intel,
|
|||
* Set stride/cpp values
|
||||
*/
|
||||
if (color_region) {
|
||||
// fprintf(stderr, "color pitch %d\n", color_region->pitch);
|
||||
state->Buffer[I915_DESTREG_CBUFADDR0] = _3DSTATE_BUF_INFO_CMD;
|
||||
state->Buffer[I915_DESTREG_CBUFADDR1] =
|
||||
(BUF_3D_ID_COLOR_BACK |
|
||||
|
|
@ -471,6 +473,7 @@ i915_state_draw_region(struct intel_context *intel,
|
|||
}
|
||||
|
||||
if (depth_region) {
|
||||
// fprintf(stderr, "depth pitch %d\n", depth_region->pitch);
|
||||
state->Buffer[I915_DESTREG_DBUFADDR0] = _3DSTATE_BUF_INFO_CMD;
|
||||
state->Buffer[I915_DESTREG_DBUFADDR1] =
|
||||
(BUF_3D_ID_DEPTH |
|
||||
|
|
|
|||
|
|
@ -79,15 +79,25 @@ intelCopyBuffer(const __DRIdrawablePrivate * dPriv,
|
|||
*/
|
||||
LOCK_HARDWARE(intel);
|
||||
|
||||
if (intel->revalidateDrawable) {
|
||||
__DRIscreenPrivate *sPriv = intel->driScreen;
|
||||
if (dPriv) {
|
||||
DRI_VALIDATE_DRAWABLE_INFO(sPriv, dPriv);
|
||||
}
|
||||
}
|
||||
|
||||
if (dPriv && dPriv->numClipRects) {
|
||||
struct intel_framebuffer *intel_fb = dPriv->driverPrivate;
|
||||
const struct intel_region *frontRegion
|
||||
= intel_get_rb_region(&intel_fb->Base, BUFFER_FRONT_LEFT);
|
||||
= intelScreen->front_region;
|
||||
const struct intel_region *backRegion
|
||||
= intel_get_rb_region(&intel_fb->Base, BUFFER_BACK_LEFT);
|
||||
= intel->ctx.DrawBuffer->_ColorDrawBufferMask[0] == BUFFER_BIT_FRONT_LEFT ?
|
||||
intel_get_rb_region(&intel_fb->Base, BUFFER_FRONT_LEFT) :
|
||||
intel_get_rb_region(&intel_fb->Base, BUFFER_BACK_LEFT);
|
||||
const int nbox = dPriv->numClipRects;
|
||||
const drm_clip_rect_t *pbox = dPriv->pClipRects;
|
||||
const int pitch = frontRegion->pitch;
|
||||
const int srcpitch = backRegion->pitch;
|
||||
const int cpp = frontRegion->cpp;
|
||||
int BR13, CMD;
|
||||
int i;
|
||||
|
|
@ -96,9 +106,12 @@ intelCopyBuffer(const __DRIdrawablePrivate * dPriv,
|
|||
ASSERT(intel_fb->Base.Name == 0); /* Not a user-created FBO */
|
||||
ASSERT(frontRegion);
|
||||
ASSERT(backRegion);
|
||||
ASSERT(frontRegion->pitch == backRegion->pitch);
|
||||
// ASSERT(frontRegion->pitch == backRegion->pitch);
|
||||
ASSERT(frontRegion->cpp == backRegion->cpp);
|
||||
|
||||
DBG("front pitch %d back pitch %d\n",
|
||||
frontRegion->pitch, backRegion->pitch);
|
||||
|
||||
if (cpp == 2) {
|
||||
BR13 = (pitch * cpp) | (0xCC << 16) | (1 << 24);
|
||||
CMD = XY_SRC_COPY_BLT_CMD;
|
||||
|
|
@ -111,6 +124,7 @@ intelCopyBuffer(const __DRIdrawablePrivate * dPriv,
|
|||
|
||||
for (i = 0; i < nbox; i++, pbox++) {
|
||||
drm_clip_rect_t box;
|
||||
drm_clip_rect_t sbox;
|
||||
|
||||
if (pbox->x1 > pbox->x2 ||
|
||||
pbox->y1 > pbox->y2 ||
|
||||
|
|
@ -133,6 +147,14 @@ intelCopyBuffer(const __DRIdrawablePrivate * dPriv,
|
|||
continue;
|
||||
}
|
||||
|
||||
DBG("box x1 x2 y1 y2 %d %d %d %d\n",
|
||||
box.x1, box.x2, box.y1, box.y2);
|
||||
|
||||
/* XXX should make sure only the minimum area based on
|
||||
old draw buffer and new front clip rects is copied */
|
||||
sbox.x1 = box.x1 - dPriv->x;
|
||||
sbox.y1 = box.y1 - dPriv->y;
|
||||
|
||||
BEGIN_BATCH(8, INTEL_BATCH_NO_CLIPRECTS);
|
||||
OUT_BATCH(CMD);
|
||||
OUT_BATCH(BR13);
|
||||
|
|
@ -141,8 +163,8 @@ intelCopyBuffer(const __DRIdrawablePrivate * dPriv,
|
|||
|
||||
OUT_RELOC(frontRegion->buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_WRITE,
|
||||
DRM_BO_MASK_MEM | DRM_BO_FLAG_WRITE, 0);
|
||||
OUT_BATCH((pbox->y1 << 16) | pbox->x1);
|
||||
OUT_BATCH(BR13 & 0xffff);
|
||||
OUT_BATCH((sbox.y1 << 16) | sbox.x1);
|
||||
OUT_BATCH((srcpitch * cpp) & 0xffff);
|
||||
OUT_RELOC(backRegion->buffer, DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_READ,
|
||||
DRM_BO_MASK_MEM | DRM_BO_FLAG_READ, 0);
|
||||
|
||||
|
|
@ -156,6 +178,12 @@ intelCopyBuffer(const __DRIdrawablePrivate * dPriv,
|
|||
}
|
||||
|
||||
UNLOCK_HARDWARE(intel);
|
||||
|
||||
if (intel->revalidateDrawable) {
|
||||
intel->revalidateDrawable = GL_FALSE;
|
||||
intelWindowMoved(intel);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -409,9 +437,8 @@ intelClearWithBlit(GLcontext * ctx, GLbitfield mask)
|
|||
b = *box;
|
||||
}
|
||||
|
||||
if (0)
|
||||
_mesa_printf("clear %d,%d..%d,%d, mask %x\n",
|
||||
b.x1, b.y1, b.x2, b.y2, mask);
|
||||
DBG("clear %d,%d..%d,%d, mask %x\n",
|
||||
b.x1, b.y1, b.x2, b.y2, mask);
|
||||
|
||||
/* Loop over all renderbuffers */
|
||||
for (buf = 0; buf < BUFFER_COUNT && clearMask; buf++) {
|
||||
|
|
|
|||
|
|
@ -146,56 +146,29 @@ intelSetRenderbufferClipRects(struct intel_context *intel)
|
|||
intel->drawY = 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* As above, but for rendering to front buffer of a window.
|
||||
* \sa intelSetRenderbufferClipRects
|
||||
* As above, but for rendering private front/back buffer of a window.
|
||||
* \sa intelSetPrivbufClipRects
|
||||
*/
|
||||
|
||||
static void
|
||||
intelSetFrontClipRects(struct intel_context *intel)
|
||||
intelSetPrivbufClipRects(struct intel_context *intel)
|
||||
{
|
||||
__DRIdrawablePrivate *dPriv = intel->driDrawable;
|
||||
|
||||
if (!dPriv)
|
||||
return;
|
||||
|
||||
intel->numClipRects = dPriv->numClipRects;
|
||||
intel->pClipRects = dPriv->pClipRects;
|
||||
intel->drawX = dPriv->x;
|
||||
intel->drawY = dPriv->y;
|
||||
intel->fakeClipRect.x1 = 0;
|
||||
intel->fakeClipRect.y1 = 0;
|
||||
intel->fakeClipRect.x2 = dPriv->w;
|
||||
intel->fakeClipRect.y2 = dPriv->h;
|
||||
intel->numClipRects = 1;
|
||||
intel->pClipRects = &intel->fakeClipRect;
|
||||
intel->drawX = 0;
|
||||
intel->drawY = 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* As above, but for rendering to back buffer of a window.
|
||||
*/
|
||||
static void
|
||||
intelSetBackClipRects(struct intel_context *intel)
|
||||
{
|
||||
__DRIdrawablePrivate *dPriv = intel->driDrawable;
|
||||
struct intel_framebuffer *intel_fb;
|
||||
|
||||
if (!dPriv)
|
||||
return;
|
||||
|
||||
intel_fb = dPriv->driverPrivate;
|
||||
|
||||
if (intel_fb->pf_active || dPriv->numBackClipRects == 0) {
|
||||
/* use the front clip rects */
|
||||
intel->numClipRects = dPriv->numClipRects;
|
||||
intel->pClipRects = dPriv->pClipRects;
|
||||
intel->drawX = dPriv->x;
|
||||
intel->drawY = dPriv->y;
|
||||
}
|
||||
else {
|
||||
/* use the back clip rects */
|
||||
intel->numClipRects = dPriv->numBackClipRects;
|
||||
intel->pClipRects = dPriv->pBackClipRects;
|
||||
intel->drawX = dPriv->backX;
|
||||
intel->drawY = dPriv->backY;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* This will be called whenever the currently bound window is moved/resized.
|
||||
|
|
@ -210,27 +183,10 @@ intelWindowMoved(struct intel_context *intel)
|
|||
|
||||
if (!intel->ctx.DrawBuffer) {
|
||||
/* when would this happen? -BP */
|
||||
intelSetFrontClipRects(intel);
|
||||
}
|
||||
else if (intel->ctx.DrawBuffer->Name != 0) {
|
||||
/* drawing to user-created FBO - do nothing */
|
||||
/* Cliprects would be set from intelDrawBuffer() */
|
||||
}
|
||||
else {
|
||||
/* drawing to a window */
|
||||
switch (intel_fb->Base._ColorDrawBufferMask[0]) {
|
||||
case BUFFER_BIT_FRONT_LEFT:
|
||||
intelSetFrontClipRects(intel);
|
||||
break;
|
||||
case BUFFER_BIT_BACK_LEFT:
|
||||
intelSetBackClipRects(intel);
|
||||
break;
|
||||
default:
|
||||
/* glDrawBuffer(GL_NONE or GL_FRONT_AND_BACK): software fallback */
|
||||
intelSetFrontClipRects(intel);
|
||||
}
|
||||
intel->numClipRects = 0;
|
||||
}
|
||||
|
||||
|
||||
if (intel->intelScreen->driScrnPriv->ddxMinor >= 7) {
|
||||
drmI830Sarea *sarea = intel->sarea;
|
||||
drm_clip_rect_t drw_rect = { .x1 = dPriv->x, .x2 = dPriv->x + dPriv->w,
|
||||
|
|
@ -316,7 +272,8 @@ intelWindowMoved(struct intel_context *intel)
|
|||
flags = intel_fb->vblank_flags & ~VBLANK_FLAG_SECONDARY;
|
||||
}
|
||||
|
||||
if (flags != intel_fb->vblank_flags) {
|
||||
if (flags != intel_fb->vblank_flags && intel_fb->vblank_flags &&
|
||||
!(intel_fb->vblank_flags & VBLANK_FLAG_NO_IRQ)) {
|
||||
drmVBlank vbl;
|
||||
int i;
|
||||
|
||||
|
|
@ -327,7 +284,9 @@ intelWindowMoved(struct intel_context *intel)
|
|||
}
|
||||
|
||||
for (i = 0; i < intel_fb->pf_num_pages; i++) {
|
||||
if (!intel_fb->color_rb[i])
|
||||
if (!intel_fb->color_rb[i] ||
|
||||
(intel_fb->vbl_waited - intel_fb->color_rb[i]->vbl_pending) <=
|
||||
(1<<23))
|
||||
continue;
|
||||
|
||||
vbl.request.sequence = intel_fb->color_rb[i]->vbl_pending;
|
||||
|
|
@ -479,6 +438,7 @@ void
|
|||
intelRotateWindow(struct intel_context *intel,
|
||||
__DRIdrawablePrivate * dPriv, GLuint srcBuf)
|
||||
{
|
||||
|
||||
intelScreenPrivate *screen = intel->intelScreen;
|
||||
drm_clip_rect_t fullRect;
|
||||
struct intel_framebuffer *intel_fb;
|
||||
|
|
@ -828,7 +788,8 @@ intelScheduleSwap(const __DRIdrawablePrivate * dPriv, GLboolean *missed_target)
|
|||
drm_i915_vblank_swap_t swap;
|
||||
GLboolean ret;
|
||||
|
||||
if ((intel_fb->vblank_flags & VBLANK_FLAG_NO_IRQ) ||
|
||||
if (!intel_fb->vblank_flags ||
|
||||
(intel_fb->vblank_flags & VBLANK_FLAG_NO_IRQ) ||
|
||||
intelScreen->current_rotation != 0 ||
|
||||
intelScreen->drmMinor < (intel_fb->pf_active ? 9 : 6))
|
||||
return GL_FALSE;
|
||||
|
|
@ -909,7 +870,7 @@ intelSwapBuffers(__DRIdrawablePrivate * dPriv)
|
|||
GLboolean missed_target;
|
||||
struct intel_framebuffer *intel_fb = dPriv->driverPrivate;
|
||||
int64_t ust;
|
||||
|
||||
|
||||
_mesa_notifySwapBuffers(ctx); /* flush pending rendering comands */
|
||||
|
||||
if (screen->current_rotation != 0 ||
|
||||
|
|
@ -953,10 +914,17 @@ intelCopySubBuffer(__DRIdrawablePrivate * dPriv, int x, int y, int w, int h)
|
|||
|
||||
if (ctx->Visual.doubleBufferMode) {
|
||||
drm_clip_rect_t rect;
|
||||
#if 1
|
||||
rect.x1 = x + dPriv->x;
|
||||
rect.y1 = (dPriv->h - y - h) + dPriv->y;
|
||||
rect.x2 = rect.x1 + w;
|
||||
rect.y2 = rect.y1 + h;
|
||||
#else
|
||||
rect.x1 = x;
|
||||
rect.y1 = dPriv->h - y;
|
||||
rect.x2 = rect.x1 + w;
|
||||
rect.y2 = rect.y1 + h;
|
||||
#endif
|
||||
_mesa_notifySwapBuffers(ctx); /* flush pending rendering comands */
|
||||
intelCopyBuffer(dPriv, &rect);
|
||||
}
|
||||
|
|
@ -991,7 +959,7 @@ intel_draw_buffer(GLcontext * ctx, struct gl_framebuffer *fb)
|
|||
return;
|
||||
}
|
||||
|
||||
/* Do this here, note core Mesa, since this function is called from
|
||||
/* Do this here, not core Mesa, since this function is called from
|
||||
* many places within the driver.
|
||||
*/
|
||||
if (ctx->NewState & (_NEW_BUFFERS | _NEW_COLOR | _NEW_PIXEL)) {
|
||||
|
|
@ -1015,12 +983,7 @@ intel_draw_buffer(GLcontext * ctx, struct gl_framebuffer *fb)
|
|||
/*
|
||||
* How many color buffers are we drawing into?
|
||||
*/
|
||||
if (fb->_NumColorDrawBuffers[0] != 1
|
||||
#if 0
|
||||
/* XXX FBO temporary - always use software rendering */
|
||||
|| 1
|
||||
#endif
|
||||
) {
|
||||
if (fb->_NumColorDrawBuffers[0] != 1) {
|
||||
/* writing to 0 or 2 or 4 color buffers */
|
||||
/*_mesa_debug(ctx, "Software rendering\n");*/
|
||||
FALLBACK(intel, INTEL_FALLBACK_DRAW_BUFFER, GL_TRUE);
|
||||
|
|
@ -1040,13 +1003,12 @@ intel_draw_buffer(GLcontext * ctx, struct gl_framebuffer *fb)
|
|||
* And set up cliprects.
|
||||
*/
|
||||
if (fb->Name == 0) {
|
||||
intelSetPrivbufClipRects(intel);
|
||||
/* drawing to window system buffer */
|
||||
if (front) {
|
||||
intelSetFrontClipRects(intel);
|
||||
colorRegion = intel_get_rb_region(fb, BUFFER_FRONT_LEFT);
|
||||
}
|
||||
else {
|
||||
intelSetBackClipRects(intel);
|
||||
colorRegion = intel_get_rb_region(fb, BUFFER_BACK_LEFT);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -289,18 +289,22 @@ intelFlush(GLcontext * ctx)
|
|||
* Check if we need to rotate/warp the front color buffer to the
|
||||
* rotated screen. We generally need to do this when we get a glFlush
|
||||
* or glFinish after drawing to the front color buffer.
|
||||
* If no rotation, just copy the private fake front buffer to the real one.
|
||||
*/
|
||||
static void
|
||||
intelCheckFrontRotate(GLcontext * ctx)
|
||||
intelCheckFrontUpdate(GLcontext * ctx)
|
||||
{
|
||||
struct intel_context *intel = intel_context(ctx);
|
||||
if (intel->ctx.DrawBuffer->_ColorDrawBufferMask[0] ==
|
||||
BUFFER_BIT_FRONT_LEFT) {
|
||||
intelScreenPrivate *screen = intel->intelScreen;
|
||||
__DRIdrawablePrivate *dPriv = intel->driDrawable;
|
||||
if (screen->current_rotation != 0) {
|
||||
__DRIdrawablePrivate *dPriv = intel->driDrawable;
|
||||
intelRotateWindow(intel, dPriv, BUFFER_BIT_FRONT_LEFT);
|
||||
}
|
||||
else {
|
||||
intelCopyBuffer(dPriv, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -312,7 +316,7 @@ static void
|
|||
intelglFlush(GLcontext * ctx)
|
||||
{
|
||||
intelFlush(ctx);
|
||||
intelCheckFrontRotate(ctx);
|
||||
intelCheckFrontUpdate(ctx);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
@ -326,7 +330,7 @@ intelFinish(GLcontext * ctx)
|
|||
driFenceUnReference(intel->batch->last_fence);
|
||||
intel->batch->last_fence = NULL;
|
||||
}
|
||||
intelCheckFrontRotate(ctx);
|
||||
intelCheckFrontUpdate(ctx);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -581,6 +585,13 @@ intelMakeCurrent(__DRIcontextPrivate * driContextPriv,
|
|||
__DRIdrawablePrivate * driReadPriv)
|
||||
{
|
||||
|
||||
#if 0
|
||||
if (driDrawPriv) {
|
||||
fprintf(stderr, "x %d, y %d, width %d, height %d\n",
|
||||
driDrawPriv->x, driDrawPriv->y, driDrawPriv->w, driDrawPriv->h);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (driContextPriv) {
|
||||
struct intel_context *intel =
|
||||
(struct intel_context *) driContextPriv->driverPrivate;
|
||||
|
|
@ -588,6 +599,9 @@ intelMakeCurrent(__DRIcontextPrivate * driContextPriv,
|
|||
(struct intel_framebuffer *) driDrawPriv->driverPrivate;
|
||||
GLframebuffer *readFb = (GLframebuffer *) driReadPriv->driverPrivate;
|
||||
|
||||
/* this is a hack so we have a valid context when the region allocation
|
||||
is done. Need a per-screen context? */
|
||||
intel->intelScreen->dummyctxptr = intel;
|
||||
|
||||
/* XXX FBO temporary fix-ups! */
|
||||
/* if the renderbuffers don't have regions, init them from the context */
|
||||
|
|
@ -625,18 +639,30 @@ intelMakeCurrent(__DRIcontextPrivate * driContextPriv,
|
|||
}
|
||||
|
||||
_mesa_make_current(&intel->ctx, &intel_fb->Base, readFb);
|
||||
intel->intelScreen->dummyctxptr = &intel->ctx;
|
||||
|
||||
/* The drawbuffer won't always be updated by _mesa_make_current:
|
||||
*/
|
||||
if (intel->ctx.DrawBuffer == &intel_fb->Base) {
|
||||
|
||||
if (intel->driDrawable != driDrawPriv) {
|
||||
intel_fb->vblank_flags = (intel->intelScreen->irq_active != 0)
|
||||
? driGetDefaultVBlankFlags(&intel->optionCache)
|
||||
: VBLANK_FLAG_NO_IRQ;
|
||||
(*dri_interface->getUST) (&intel_fb->swap_ust);
|
||||
driDrawableInitVBlank(driDrawPriv, intel_fb->vblank_flags,
|
||||
&intel_fb->vbl_seq);
|
||||
if (driDrawPriv->pdraw->swap_interval == (unsigned)-1) {
|
||||
int i;
|
||||
|
||||
intel_fb->vblank_flags = (intel->intelScreen->irq_active != 0)
|
||||
? driGetDefaultVBlankFlags(&intel->optionCache)
|
||||
: VBLANK_FLAG_NO_IRQ;
|
||||
|
||||
(*dri_interface->getUST) (&intel_fb->swap_ust);
|
||||
driDrawableInitVBlank(driDrawPriv, intel_fb->vblank_flags,
|
||||
&intel_fb->vbl_seq);
|
||||
intel_fb->vbl_waited = intel_fb->vbl_seq;
|
||||
|
||||
for (i = 0; i < (intel->intelScreen->third.handle ? 3 : 2); i++) {
|
||||
if (intel_fb->color_rb[i])
|
||||
intel_fb->color_rb[i]->vbl_pending = intel_fb->vbl_seq;
|
||||
}
|
||||
}
|
||||
intel->driDrawable = driDrawPriv;
|
||||
intelWindowMoved(intel);
|
||||
}
|
||||
|
|
@ -670,7 +696,8 @@ intelContendedLock(struct intel_context *intel, GLuint flags)
|
|||
* checking must be done *after* this call:
|
||||
*/
|
||||
if (dPriv)
|
||||
DRI_VALIDATE_DRAWABLE_INFO(sPriv, dPriv);
|
||||
intel->revalidateDrawable = GL_TRUE;
|
||||
// DRI_VALIDATE_DRAWABLE_INFO(sPriv, dPriv);
|
||||
|
||||
if (sarea->width != intelScreen->width ||
|
||||
sarea->height != intelScreen->height ||
|
||||
|
|
@ -679,40 +706,31 @@ intelContendedLock(struct intel_context *intel, GLuint flags)
|
|||
intelUpdateScreenRotation(sPriv, sarea);
|
||||
}
|
||||
|
||||
#if 0
|
||||
if (sarea->width != intel->width ||
|
||||
sarea->height != intel->height ||
|
||||
sarea->rotation != intel->current_rotation) {
|
||||
|
||||
void *batchMap = intel->batch->map;
|
||||
|
||||
int numClipRects = intel->numClipRects;
|
||||
|
||||
/*
|
||||
* FIXME: Really only need to do this when drawing to a
|
||||
* common back- or front buffer.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This will drop the outstanding batchbuffer on the floor
|
||||
* This will essentially drop the outstanding batchbuffer on the floor.
|
||||
*/
|
||||
intel->numClipRects = 0;
|
||||
|
||||
if (batchMap != NULL) {
|
||||
driBOUnmap(intel->batch->buffer);
|
||||
intel->batch->map = NULL;
|
||||
}
|
||||
if (intel->Fallback)
|
||||
_swrast_flush(&intel->ctx);
|
||||
|
||||
intel_batchbuffer_reset(intel->batch);
|
||||
INTEL_FIREVERTICES(intel);
|
||||
|
||||
if (batchMap == NULL) {
|
||||
driBOUnmap(intel->batch->buffer);
|
||||
intel->batch->map = NULL;
|
||||
}
|
||||
if (intel->batch->map != intel->batch->ptr)
|
||||
intel_batchbuffer_flush(intel->batch);
|
||||
|
||||
/* lose all primitives */
|
||||
intel->prim.primitive = ~0;
|
||||
intel->prim.start_ptr = 0;
|
||||
intel->prim.flush = 0;
|
||||
|
||||
/* re-emit all state */
|
||||
intel->vtbl.lost_hardware(intel);
|
||||
intel->numClipRects = numClipRects;
|
||||
|
||||
/* force window update */
|
||||
intel->lastStamp = 0;
|
||||
|
|
@ -721,13 +739,7 @@ intelContendedLock(struct intel_context *intel, GLuint flags)
|
|||
intel->height = sarea->height;
|
||||
intel->current_rotation = sarea->rotation;
|
||||
}
|
||||
|
||||
/* Drawable changed?
|
||||
*/
|
||||
if (dPriv && intel->lastStamp != dPriv->lastStamp) {
|
||||
intelWindowMoved(intel);
|
||||
intel->lastStamp = dPriv->lastStamp;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -753,7 +765,9 @@ void LOCK_HARDWARE( struct intel_context *intel )
|
|||
BUFFER_BACK_LEFT);
|
||||
}
|
||||
|
||||
if (intel_rb && (intel_fb->vbl_waited - intel_rb->vbl_pending) > (1<<23)) {
|
||||
if (intel_rb && intel_fb->vblank_flags &&
|
||||
!(intel_fb->vblank_flags & VBLANK_FLAG_NO_IRQ) &&
|
||||
(intel_fb->vbl_waited - intel_rb->vbl_pending) > (1<<23)) {
|
||||
drmVBlank vbl;
|
||||
|
||||
vbl.request.type = DRM_VBLANK_ABSOLUTE;
|
||||
|
|
|
|||
|
|
@ -254,6 +254,7 @@ struct intel_context
|
|||
GLuint numClipRects; /**< cliprects for drawing */
|
||||
drm_clip_rect_t *pClipRects;
|
||||
drm_clip_rect_t fboRect; /**< cliprect for FBO rendering */
|
||||
drm_clip_rect_t fakeClipRect; /**< cliprect for priv back/fake front buffers rendering */
|
||||
|
||||
int perf_boxes;
|
||||
|
||||
|
|
@ -272,6 +273,7 @@ struct intel_context
|
|||
drmI830Sarea *sarea;
|
||||
|
||||
GLuint lastStamp;
|
||||
GLuint revalidateDrawable;
|
||||
|
||||
/**
|
||||
* Configuration cache
|
||||
|
|
@ -353,7 +355,7 @@ __memcpy(void *to, const void *from, size_t n)
|
|||
/* ================================================================
|
||||
* Debugging:
|
||||
*/
|
||||
#define DO_DEBUG 0
|
||||
#define DO_DEBUG 1
|
||||
#if DO_DEBUG
|
||||
extern int INTEL_DEBUG;
|
||||
#else
|
||||
|
|
|
|||
|
|
@ -176,7 +176,7 @@ intel_get_pointer(GLcontext * ctx, struct gl_renderbuffer *rb,
|
|||
|
||||
/**
|
||||
* Called via glRenderbufferStorageEXT() to set the format and allocate
|
||||
* storage for a user-created renderbuffer.
|
||||
* storage for a user-created (or priv buffer) renderbuffer.
|
||||
*/
|
||||
static GLboolean
|
||||
intel_alloc_renderbuffer_storage(GLcontext * ctx, struct gl_renderbuffer *rb,
|
||||
|
|
@ -188,8 +188,6 @@ intel_alloc_renderbuffer_storage(GLcontext * ctx, struct gl_renderbuffer *rb,
|
|||
GLboolean softwareBuffer = GL_FALSE;
|
||||
int cpp;
|
||||
|
||||
ASSERT(rb->Name != 0);
|
||||
|
||||
switch (internalFormat) {
|
||||
case GL_R3_G3_B2:
|
||||
case GL_RGB4:
|
||||
|
|
@ -257,7 +255,7 @@ intel_alloc_renderbuffer_storage(GLcontext * ctx, struct gl_renderbuffer *rb,
|
|||
break;
|
||||
default:
|
||||
_mesa_problem(ctx,
|
||||
"Unexpected format in intel_alloc_renderbuffer_storage");
|
||||
"Unexpected format (%x) in intel_alloc_renderbuffer_storage", internalFormat);
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
|
|
@ -453,6 +451,29 @@ intel_create_renderbuffer(GLenum intFormat, GLsizei width, GLsizei height,
|
|||
return irb;
|
||||
}
|
||||
|
||||
struct gl_renderbuffer *
|
||||
intel_new_renderbuffer_fb(GLcontext * ctx, GLuint intFormat)
|
||||
{
|
||||
struct intel_renderbuffer *irb;
|
||||
|
||||
irb = CALLOC_STRUCT(intel_renderbuffer);
|
||||
if (!irb) {
|
||||
_mesa_error(ctx, GL_OUT_OF_MEMORY, "creating renderbuffer");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
_mesa_init_renderbuffer(&irb->Base, 0);
|
||||
irb->Base.ClassID = INTEL_RB_CLASS;
|
||||
irb->Base.InternalFormat = intFormat;
|
||||
|
||||
/* intel-specific methods */
|
||||
irb->Base.Delete = intel_delete_renderbuffer;
|
||||
irb->Base.AllocStorage = intel_alloc_renderbuffer_storage;
|
||||
irb->Base.GetPointer = intel_get_pointer;
|
||||
/* span routines set in alloc_storage function */
|
||||
|
||||
return &irb->Base;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new renderbuffer object.
|
||||
|
|
|
|||
|
|
@ -370,10 +370,16 @@ intelDrawPixels(GLcontext * ctx,
|
|||
* wise happily run the fragment program on each pixel in the image).
|
||||
*/
|
||||
struct gl_fragment_program *fpSave = ctx->FragmentProgram._Current;
|
||||
/* can't just set current frag prog to 0 here as on buffer resize
|
||||
we'll get new state checks which will segfault. Remains a hack. */
|
||||
ctx->FragmentProgram._Current = NULL;
|
||||
ctx->FragmentProgram._UseTexEnvProgram = GL_FALSE;
|
||||
ctx->FragmentProgram._Active = GL_FALSE;
|
||||
_swrast_DrawPixels( ctx, x, y, width, height, format, type,
|
||||
unpack, pixels );
|
||||
ctx->FragmentProgram._Current = fpSave;
|
||||
ctx->FragmentProgram._UseTexEnvProgram = GL_TRUE;
|
||||
ctx->FragmentProgram._Active = GL_TRUE;
|
||||
}
|
||||
else {
|
||||
_swrast_DrawPixels( ctx, x, y, width, height, format, type,
|
||||
|
|
|
|||
|
|
@ -88,6 +88,7 @@ intelMapScreenRegions(__DRIscreenPrivate * sPriv)
|
|||
_mesa_warning(NULL, "no front buffer handle in intelMapScreenRegions!");
|
||||
}
|
||||
|
||||
#if 0
|
||||
if (0)
|
||||
_mesa_printf("Back 0x%08x ", intelScreen->back.handle);
|
||||
if (drmMap(sPriv->fd,
|
||||
|
|
@ -119,6 +120,7 @@ intelMapScreenRegions(__DRIscreenPrivate * sPriv)
|
|||
intelUnmapScreenRegions(intelScreen);
|
||||
return GL_FALSE;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
_mesa_printf("TEX 0x%08x ", intelScreen->tex.handle);
|
||||
|
|
@ -156,7 +158,7 @@ intel_recreate_static(intelScreenPrivate *intelScreen,
|
|||
}
|
||||
return region;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Create intel_region structs to describe the static front,back,depth
|
||||
* buffers created by the xserver.
|
||||
|
|
@ -172,6 +174,7 @@ intel_recreate_static(intelScreenPrivate *intelScreen,
|
|||
static void
|
||||
intel_recreate_static_regions(intelScreenPrivate *intelScreen)
|
||||
{
|
||||
/* this is the real front buffer which is only used for blitting to */
|
||||
intelScreen->front_region =
|
||||
intel_recreate_static(intelScreen,
|
||||
intelScreen->front_region,
|
||||
|
|
@ -192,7 +195,7 @@ intel_recreate_static_regions(intelScreenPrivate *intelScreen)
|
|||
intelScreen->rotated.pitch /
|
||||
intelScreen->cpp, intelScreen->height);
|
||||
|
||||
|
||||
#if 0
|
||||
intelScreen->back_region =
|
||||
intel_recreate_static(intelScreen,
|
||||
intelScreen->back_region,
|
||||
|
|
@ -226,6 +229,7 @@ intel_recreate_static_regions(intelScreenPrivate *intelScreen)
|
|||
intelScreen->cpp,
|
||||
intelScreen->depth.pitch / intelScreen->cpp,
|
||||
intelScreen->height);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -382,7 +386,7 @@ intelUpdateScreenFromSAREA(intelScreenPrivate * intelScreen,
|
|||
intelScreen->rotatedWidth = sarea->virtualX;
|
||||
intelScreen->rotatedHeight = sarea->virtualY;
|
||||
|
||||
if (0)
|
||||
if (1)
|
||||
intelPrintSAREA(sarea);
|
||||
}
|
||||
|
||||
|
|
@ -600,6 +604,7 @@ intelCreateBuffer(__DRIscreenPrivate * driScrnPriv,
|
|||
|
||||
_mesa_initialize_framebuffer(&intel_fb->Base, mesaVis);
|
||||
|
||||
#if 0
|
||||
/* setup the hardware-based renderbuffers */
|
||||
{
|
||||
intel_fb->color_rb[0]
|
||||
|
|
@ -640,7 +645,6 @@ intelCreateBuffer(__DRIscreenPrivate * driScrnPriv,
|
|||
_mesa_reference_renderbuffer(&tmp_rb, &intel_fb->color_rb[2]->Base);
|
||||
}
|
||||
}
|
||||
|
||||
if (mesaVis->depthBits == 24 && mesaVis->stencilBits == 8) {
|
||||
/* combined depth/stencil buffer */
|
||||
struct intel_renderbuffer *depthStencilRb
|
||||
|
|
@ -670,6 +674,50 @@ intelCreateBuffer(__DRIscreenPrivate * driScrnPriv,
|
|||
_mesa_add_renderbuffer(&intel_fb->Base, BUFFER_DEPTH, &depthRb->Base);
|
||||
}
|
||||
|
||||
#else
|
||||
{
|
||||
/* fake frontbuffer */
|
||||
/* XXX allocation should only happen in the unusual case
|
||||
it's actually needed */
|
||||
intel_fb->color_rb[0]
|
||||
= intel_new_renderbuffer_fb(NULL, rgbFormat);
|
||||
_mesa_add_renderbuffer(&intel_fb->Base, BUFFER_FRONT_LEFT,
|
||||
&intel_fb->color_rb[0]->Base);
|
||||
}
|
||||
|
||||
if (mesaVis->doubleBufferMode) {
|
||||
intel_fb->color_rb[1]
|
||||
= intel_new_renderbuffer_fb(NULL, rgbFormat);
|
||||
_mesa_add_renderbuffer(&intel_fb->Base, BUFFER_BACK_LEFT,
|
||||
&intel_fb->color_rb[1]->Base);
|
||||
|
||||
if (screen->third.handle) {
|
||||
struct gl_renderbuffer *tmp_rb = NULL;
|
||||
|
||||
intel_fb->color_rb[2]
|
||||
= intel_new_renderbuffer_fb(NULL, rgbFormat);
|
||||
_mesa_reference_renderbuffer(&tmp_rb, &intel_fb->color_rb[2]->Base);
|
||||
}
|
||||
}
|
||||
if (mesaVis->depthBits == 24 && mesaVis->stencilBits == 8) {
|
||||
/* combined depth/stencil buffer */
|
||||
struct intel_renderbuffer *depthStencilRb
|
||||
= intel_new_renderbuffer_fb(NULL, GL_DEPTH24_STENCIL8_EXT);
|
||||
/* note: bind RB to two attachment points */
|
||||
_mesa_add_renderbuffer(&intel_fb->Base, BUFFER_DEPTH,
|
||||
&depthStencilRb->Base);
|
||||
_mesa_add_renderbuffer(&intel_fb->Base, BUFFER_STENCIL,
|
||||
&depthStencilRb->Base);
|
||||
}
|
||||
else if (mesaVis->depthBits == 16) {
|
||||
/* just 16-bit depth buffer, no hw stencil */
|
||||
struct intel_renderbuffer *depthRb
|
||||
= intel_new_renderbuffer_fb(NULL, GL_DEPTH_COMPONENT16);
|
||||
_mesa_add_renderbuffer(&intel_fb->Base, BUFFER_DEPTH, &depthRb->Base);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* now add any/all software-based renderbuffers we may need */
|
||||
_mesa_add_soft_renderbuffers(&intel_fb->Base,
|
||||
GL_FALSE, /* never sw color */
|
||||
|
|
@ -939,11 +987,18 @@ struct intel_context *intelScreenContext(intelScreenPrivate *intelScreen)
|
|||
* context at screen creation. For now just use the current context.
|
||||
*/
|
||||
|
||||
GET_CURRENT_CONTEXT(ctx);
|
||||
/* GET_CURRENT_CONTEXT(ctx);
|
||||
if (ctx == NULL) {
|
||||
_mesa_problem(NULL, "No current context in intelScreenContext\n");
|
||||
return NULL;
|
||||
}
|
||||
return intel_context(ctx);
|
||||
*/
|
||||
if (intelScreen->dummyctxptr == NULL) {
|
||||
_mesa_problem(NULL, "No current context in intelScreenContext\n");
|
||||
return NULL;
|
||||
}
|
||||
return intelScreen->dummyctxptr;
|
||||
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -96,6 +96,7 @@ typedef struct
|
|||
struct _DriBufferPool *staticPool;
|
||||
unsigned int maxBatchSize;
|
||||
GLboolean havePools;
|
||||
struct intel_context *dummyctxptr;
|
||||
} intelScreenPrivate;
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -205,25 +205,17 @@ intelCalcViewport(GLcontext * ctx)
|
|||
GLfloat *m = intel->ViewportMatrix.m;
|
||||
GLfloat yScale, yBias;
|
||||
|
||||
if (ctx->DrawBuffer->Name) {
|
||||
/* User created FBO */
|
||||
struct intel_renderbuffer *irb
|
||||
struct intel_renderbuffer *irb
|
||||
= intel_renderbuffer(ctx->DrawBuffer->_ColorDrawBuffers[0][0]);
|
||||
if (irb && !irb->RenderToTexture) {
|
||||
/* y=0=top */
|
||||
yScale = -1.0;
|
||||
yBias = irb->Base.Height;
|
||||
}
|
||||
else {
|
||||
/* y=0=bottom */
|
||||
yScale = 1.0;
|
||||
yBias = 0.0;
|
||||
}
|
||||
if (irb && !irb->RenderToTexture) {
|
||||
/* y=0=top */
|
||||
yScale = -1.0;
|
||||
yBias = irb->Base.Height;
|
||||
}
|
||||
else {
|
||||
/* window buffer, y=0=top */
|
||||
yScale = -1.0;
|
||||
yBias = (intel->driDrawable) ? intel->driDrawable->h : 0.0F;
|
||||
/* y=0=bottom */
|
||||
yScale = 1.0;
|
||||
yBias = 0.0;
|
||||
}
|
||||
|
||||
m[MAT_SX] = v[MAT_SX];
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ void
|
|||
nouveau_mem_free(GLcontext *ctx, nouveau_mem *mem)
|
||||
{
|
||||
nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
|
||||
drm_nouveau_mem_free_t memf;
|
||||
struct drm_nouveau_mem_free memf;
|
||||
|
||||
if (NOUVEAU_DEBUG & DEBUG_MEM) {
|
||||
fprintf(stderr, "%s: type=0x%x, offset=0x%x, size=0x%x\n",
|
||||
|
|
@ -78,8 +78,8 @@ nouveau_mem_free(GLcontext *ctx, nouveau_mem *mem)
|
|||
|
||||
if (mem->map)
|
||||
drmUnmap(mem->map, mem->size);
|
||||
memf.flags = mem->type;
|
||||
memf.region_offset = mem->offset;
|
||||
memf.flags = mem->type;
|
||||
memf.offset = mem->offset;
|
||||
drmCommandWrite(nmesa->driFd, DRM_NOUVEAU_MEM_FREE, &memf, sizeof(memf));
|
||||
FREE(mem);
|
||||
}
|
||||
|
|
@ -88,7 +88,7 @@ nouveau_mem *
|
|||
nouveau_mem_alloc(GLcontext *ctx, int type, GLuint size, GLuint align)
|
||||
{
|
||||
nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
|
||||
drm_nouveau_mem_alloc_t mema;
|
||||
struct drm_nouveau_mem_alloc mema;
|
||||
nouveau_mem *mem;
|
||||
int ret;
|
||||
|
||||
|
|
@ -111,7 +111,7 @@ nouveau_mem_alloc(GLcontext *ctx, int type, GLuint size, GLuint align)
|
|||
FREE(mem);
|
||||
return NULL;
|
||||
}
|
||||
mem->offset = mema.region_offset;
|
||||
mem->offset = mema.offset;
|
||||
mem->type = mema.flags;
|
||||
|
||||
if (NOUVEAU_DEBUG & DEBUG_MEM) {
|
||||
|
|
@ -120,7 +120,7 @@ nouveau_mem_alloc(GLcontext *ctx, int type, GLuint size, GLuint align)
|
|||
}
|
||||
|
||||
if (type & NOUVEAU_MEM_MAPPED)
|
||||
ret = drmMap(nmesa->driFd, mem->offset, mem->size, &mem->map);
|
||||
ret = drmMap(nmesa->driFd, mema.map_handle, mem->size, &mem->map);
|
||||
if (ret) {
|
||||
mem->map = NULL;
|
||||
nouveau_mem_free(ctx, mem);
|
||||
|
|
@ -135,12 +135,7 @@ nouveau_mem_gpu_offset_get(GLcontext *ctx, nouveau_mem *mem)
|
|||
{
|
||||
nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
|
||||
|
||||
if (mem->type & NOUVEAU_MEM_FB)
|
||||
return (uint32_t)mem->offset - nmesa->vram_phys;
|
||||
else if (mem->type & NOUVEAU_MEM_AGP)
|
||||
return (uint32_t)mem->offset - nmesa->gart_phys;
|
||||
else
|
||||
return 0xDEADF00D;
|
||||
return mem->offset;
|
||||
}
|
||||
|
||||
static GLboolean
|
||||
|
|
|
|||
|
|
@ -180,7 +180,7 @@ GLboolean nouveauCreateContext( const __GLcontextModes *glVisual,
|
|||
driParseConfigFiles (&nmesa->optionCache, &screen->optionCache,
|
||||
screen->driScreen->myNum, "nouveau");
|
||||
|
||||
nmesa->sarea = (drm_nouveau_sarea_t *)((char *)sPriv->pSAREA +
|
||||
nmesa->sarea = (struct drm_nouveau_sarea *)((char *)sPriv->pSAREA +
|
||||
screen->sarea_priv_offset);
|
||||
|
||||
/* Enable any supported extensions */
|
||||
|
|
@ -224,6 +224,8 @@ GLboolean nouveauCreateContext( const __GLcontextModes *glVisual,
|
|||
nv04TriInitFunctions( ctx );
|
||||
break;
|
||||
case NV_10:
|
||||
case NV_11:
|
||||
case NV_17:
|
||||
case NV_20:
|
||||
case NV_30:
|
||||
case NV_40:
|
||||
|
|
|
|||
|
|
@ -109,12 +109,12 @@ typedef struct nouveau_context {
|
|||
uint64_t gart_size;
|
||||
|
||||
/* Channel synchronisation */
|
||||
drm_nouveau_notifier_alloc_t *syncNotifier;
|
||||
struct drm_nouveau_notifier_alloc *syncNotifier;
|
||||
|
||||
/* ARB_occlusion_query / EXT_timer_query */
|
||||
GLuint query_object_max;
|
||||
GLboolean * query_alloc;
|
||||
drm_nouveau_notifier_alloc_t *queryNotifier;
|
||||
struct drm_nouveau_notifier_alloc *queryNotifier;
|
||||
|
||||
/* Additional hw-specific functions */
|
||||
nouveau_hw_func hw_func;
|
||||
|
|
@ -168,7 +168,7 @@ typedef struct nouveau_context {
|
|||
nouveauShader *passthrough_fp;
|
||||
|
||||
nouveauScreenRec *screen;
|
||||
drm_nouveau_sarea_t *sarea;
|
||||
struct drm_nouveau_sarea *sarea;
|
||||
|
||||
__DRIcontextPrivate *driContext; /* DRI context */
|
||||
__DRIscreenPrivate *driScreen; /* DRI screen */
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ GLboolean nouveauDRMGetParam(nouveauContextPtr nmesa,
|
|||
unsigned int param,
|
||||
uint64_t* value)
|
||||
{
|
||||
drm_nouveau_getparam_t getp;
|
||||
struct drm_nouveau_getparam getp;
|
||||
|
||||
getp.param = param;
|
||||
if (!value || drmCommandWriteRead(nmesa->driFd, DRM_NOUVEAU_GETPARAM,
|
||||
|
|
@ -56,7 +56,7 @@ GLboolean nouveauDRMSetParam(nouveauContextPtr nmesa,
|
|||
unsigned int param,
|
||||
uint64_t value)
|
||||
{
|
||||
drm_nouveau_setparam_t setp;
|
||||
struct drm_nouveau_setparam setp;
|
||||
|
||||
setp.param = param;
|
||||
setp.value = value;
|
||||
|
|
|
|||
|
|
@ -98,7 +98,7 @@ void nouveauWaitForIdle(nouveauContextPtr nmesa)
|
|||
// here we call the fifo initialization ioctl and fill in stuff accordingly
|
||||
GLboolean nouveauFifoInit(nouveauContextPtr nmesa)
|
||||
{
|
||||
drm_nouveau_fifo_alloc_t fifo_init;
|
||||
struct drm_nouveau_fifo_alloc fifo_init;
|
||||
int i, ret;
|
||||
|
||||
#ifdef NOUVEAU_RING_DEBUG
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ void nouveauGetLock( nouveauContextPtr nmesa, GLuint flags )
|
|||
{
|
||||
__DRIdrawablePrivate *dPriv = nmesa->driDrawable;
|
||||
__DRIscreenPrivate *sPriv = nmesa->driScreen;
|
||||
drm_nouveau_sarea_t *sarea = nmesa->sarea;
|
||||
struct drm_nouveau_sarea *sarea = nmesa->sarea;
|
||||
|
||||
drmGetLock( nmesa->driFd, nmesa->hHWContext, flags );
|
||||
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
GLboolean nouveauCreateContextObject(nouveauContextPtr nmesa,
|
||||
uint32_t handle, int class)
|
||||
{
|
||||
drm_nouveau_grobj_alloc_t cto;
|
||||
struct drm_nouveau_grobj_alloc cto;
|
||||
int ret;
|
||||
|
||||
cto.channel = nmesa->fifo.channel;
|
||||
|
|
@ -34,10 +34,13 @@ void nouveauObjectInit(nouveauContextPtr nmesa)
|
|||
nouveauCreateContextObject(nmesa, Nv3D, nmesa->screen->card->class_3d);
|
||||
if (nmesa->screen->card->type>=NV_10) {
|
||||
nouveauCreateContextObject(nmesa, NvCtxSurf2D, NV10_CONTEXT_SURFACES_2D);
|
||||
nouveauCreateContextObject(nmesa, NvImageBlit, NV10_IMAGE_BLIT);
|
||||
} else {
|
||||
nouveauCreateContextObject(nmesa, NvCtxSurf2D, NV04_CONTEXT_SURFACES_2D);
|
||||
nouveauCreateContextObject(nmesa, NvCtxSurf3D, NV04_CONTEXT_SURFACES_3D);
|
||||
}
|
||||
if (nmesa->screen->card->type>=NV_11) {
|
||||
nouveauCreateContextObject(nmesa, NvImageBlit, NV10_IMAGE_BLIT);
|
||||
} else {
|
||||
nouveauCreateContextObject(nmesa, NvImageBlit, NV_IMAGE_BLIT);
|
||||
}
|
||||
nouveauCreateContextObject(nmesa, NvMemFormat, NV_MEMORY_TO_MEMORY_FORMAT);
|
||||
|
|
|
|||
|
|
@ -328,7 +328,7 @@ void * __driCreateNewScreen_20050727( __DRInativeDisplay *dpy, int scrn, __DRIsc
|
|||
static const __DRIversion ddx_expected = { 1, 2, 0 };
|
||||
static const __DRIversion dri_expected = { 4, 0, 0 };
|
||||
static const __DRIversion drm_expected = { 0, 0, NOUVEAU_DRM_HEADER_PATCHLEVEL };
|
||||
#if NOUVEAU_DRM_HEADER_PATCHLEVEL != 7
|
||||
#if NOUVEAU_DRM_HEADER_PATCHLEVEL != 9
|
||||
#error nouveau_drm.h version doesn't match expected version
|
||||
#endif
|
||||
dri_interface = interface;
|
||||
|
|
|
|||
|
|
@ -162,6 +162,8 @@ void nouveauDDInitState(nouveauContextPtr nmesa)
|
|||
nv04InitStateFuncs(nmesa->glCtx, &nmesa->glCtx->Driver);
|
||||
break;
|
||||
case NV_10:
|
||||
case NV_11:
|
||||
case NV_17:
|
||||
nv10InitStateFuncs(nmesa->glCtx, &nmesa->glCtx->Driver);
|
||||
break;
|
||||
case NV_20:
|
||||
|
|
|
|||
|
|
@ -39,11 +39,11 @@
|
|||
nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx); \
|
||||
volatile uint32_t *__v = (void*)nmesa->notifier_block + notifier->offset
|
||||
|
||||
drm_nouveau_notifier_alloc_t *
|
||||
struct drm_nouveau_notifier_alloc *
|
||||
nouveau_notifier_new(GLcontext *ctx, GLuint handle, GLuint count)
|
||||
{
|
||||
nouveauContextPtr nmesa = NOUVEAU_CONTEXT(ctx);
|
||||
drm_nouveau_notifier_alloc_t *notifier;
|
||||
struct drm_nouveau_notifier_alloc *notifier;
|
||||
int ret;
|
||||
|
||||
#ifdef NOUVEAU_RING_DEBUG
|
||||
|
|
@ -69,14 +69,16 @@ nouveau_notifier_new(GLcontext *ctx, GLuint handle, GLuint count)
|
|||
}
|
||||
|
||||
void
|
||||
nouveau_notifier_destroy(GLcontext *ctx, drm_nouveau_notifier_alloc_t *notifier)
|
||||
nouveau_notifier_destroy(GLcontext *ctx,
|
||||
struct drm_nouveau_notifier_alloc *notifier)
|
||||
{
|
||||
/*XXX: free notifier object.. */
|
||||
FREE(notifier);
|
||||
}
|
||||
|
||||
void
|
||||
nouveau_notifier_reset(GLcontext *ctx, drm_nouveau_notifier_alloc_t *notifier,
|
||||
nouveau_notifier_reset(GLcontext *ctx,
|
||||
struct drm_nouveau_notifier_alloc *notifier,
|
||||
GLuint id)
|
||||
{
|
||||
NOTIFIER(n);
|
||||
|
|
@ -93,7 +95,8 @@ nouveau_notifier_reset(GLcontext *ctx, drm_nouveau_notifier_alloc_t *notifier,
|
|||
}
|
||||
|
||||
GLuint
|
||||
nouveau_notifier_status(GLcontext *ctx, drm_nouveau_notifier_alloc_t *notifier,
|
||||
nouveau_notifier_status(GLcontext *ctx,
|
||||
struct drm_nouveau_notifier_alloc *notifier,
|
||||
GLuint id)
|
||||
{
|
||||
NOTIFIER(n);
|
||||
|
|
@ -103,7 +106,8 @@ nouveau_notifier_status(GLcontext *ctx, drm_nouveau_notifier_alloc_t *notifier,
|
|||
|
||||
GLuint
|
||||
nouveau_notifier_return_val(GLcontext *ctx,
|
||||
drm_nouveau_notifier_alloc_t *notifier, GLuint id)
|
||||
struct drm_nouveau_notifier_alloc *notifier,
|
||||
GLuint id)
|
||||
{
|
||||
NOTIFIER(n);
|
||||
|
||||
|
|
@ -112,8 +116,8 @@ nouveau_notifier_return_val(GLcontext *ctx,
|
|||
|
||||
GLboolean
|
||||
nouveau_notifier_wait_status(GLcontext *ctx,
|
||||
drm_nouveau_notifier_alloc_t *notifier, GLuint id,
|
||||
GLuint status, GLuint timeout)
|
||||
struct drm_nouveau_notifier_alloc *notifier,
|
||||
GLuint id, GLuint status, GLuint timeout)
|
||||
{
|
||||
NOTIFIER(n);
|
||||
unsigned int time = 0;
|
||||
|
|
@ -146,7 +150,8 @@ nouveau_notifier_wait_status(GLcontext *ctx,
|
|||
|
||||
void
|
||||
nouveau_notifier_wait_nop(GLcontext *ctx,
|
||||
drm_nouveau_notifier_alloc_t *notifier, GLuint subc)
|
||||
struct drm_nouveau_notifier_alloc *notifier,
|
||||
GLuint subc)
|
||||
{
|
||||
NOTIFIER(n);
|
||||
GLboolean ret;
|
||||
|
|
|
|||
|
|
@ -47,22 +47,24 @@
|
|||
#define NV_NOTIFY 0x00000104
|
||||
#define NV_NOTIFY_STYLE_WRITE_ONLY 0
|
||||
|
||||
extern drm_nouveau_notifier_alloc_t *
|
||||
extern struct drm_nouveau_notifier_alloc *
|
||||
nouveau_notifier_new(GLcontext *, GLuint handle, GLuint count);
|
||||
extern void
|
||||
nouveau_notifier_destroy(GLcontext *, drm_nouveau_notifier_alloc_t *);
|
||||
nouveau_notifier_destroy(GLcontext *, struct drm_nouveau_notifier_alloc *);
|
||||
extern void
|
||||
nouveau_notifier_reset(GLcontext *, drm_nouveau_notifier_alloc_t *, GLuint id);
|
||||
nouveau_notifier_reset(GLcontext *, struct drm_nouveau_notifier_alloc *,
|
||||
GLuint id);
|
||||
extern GLuint
|
||||
nouveau_notifier_status(GLcontext *, drm_nouveau_notifier_alloc_t *, GLuint id);
|
||||
nouveau_notifier_status(GLcontext *, struct drm_nouveau_notifier_alloc *,
|
||||
GLuint id);
|
||||
extern GLuint
|
||||
nouveau_notifier_return_val(GLcontext *, drm_nouveau_notifier_alloc_t *,
|
||||
nouveau_notifier_return_val(GLcontext *, struct drm_nouveau_notifier_alloc *,
|
||||
GLuint id);
|
||||
extern GLboolean
|
||||
nouveau_notifier_wait_status(GLcontext *, drm_nouveau_notifier_alloc_t *,
|
||||
nouveau_notifier_wait_status(GLcontext *, struct drm_nouveau_notifier_alloc *,
|
||||
GLuint id, GLuint status, GLuint timeout);
|
||||
extern void
|
||||
nouveau_notifier_wait_nop(GLcontext *ctx, drm_nouveau_notifier_alloc_t *,
|
||||
nouveau_notifier_wait_nop(GLcontext *ctx, struct drm_nouveau_notifier_alloc *,
|
||||
GLuint subc);
|
||||
|
||||
extern GLboolean nouveauSyncInitFuncs(GLcontext *ctx);
|
||||
|
|
|
|||
|
|
@ -697,8 +697,7 @@ static GLboolean nv10InitCard(nouveauContextPtr nmesa)
|
|||
BEGIN_RING_SIZE(NvSub3D, 0x03f4, 1);
|
||||
OUT_RING(0);
|
||||
|
||||
/* not for nv10, only for >= nv11 */
|
||||
if ((nmesa->screen->card->id>>4) >= 0x11) {
|
||||
if (nmesa->screen->card->type >= NV_11) {
|
||||
BEGIN_RING_SIZE(NvSub3D, 0x120, 3);
|
||||
OUT_RING(0);
|
||||
OUT_RING(1);
|
||||
|
|
@ -739,11 +738,11 @@ static GLboolean nv10BindBuffers(nouveauContextPtr nmesa, int num_color,
|
|||
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);
|
||||
/*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);
|
||||
OUT_RING_CACHEf (0.0);*/
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@ static void nv10ResetLineStipple( GLcontext *ctx );
|
|||
|
||||
static inline void nv10StartPrimitive(struct nouveau_context* nmesa,uint32_t primitive,uint32_t size)
|
||||
{
|
||||
if (nmesa->screen->card->type==NV_10)
|
||||
if ((nmesa->screen->card->type>=NV_10) && (nmesa->screen->card->type<=NV_17))
|
||||
BEGIN_RING_SIZE(NvSub3D,NV10_TCL_PRIMITIVE_3D_BEGIN_END,1);
|
||||
else if (nmesa->screen->card->type==NV_20)
|
||||
BEGIN_RING_SIZE(NvSub3D,NV20_TCL_PRIMITIVE_3D_BEGIN_END,1);
|
||||
|
|
@ -66,7 +66,7 @@ static inline void nv10StartPrimitive(struct nouveau_context* nmesa,uint32_t pri
|
|||
BEGIN_RING_SIZE(NvSub3D,NV30_TCL_PRIMITIVE_3D_BEGIN_END,1);
|
||||
OUT_RING(primitive);
|
||||
|
||||
if (nmesa->screen->card->type==NV_10)
|
||||
if ((nmesa->screen->card->type>=NV_10) && (nmesa->screen->card->type<=NV_17))
|
||||
BEGIN_RING_SIZE(NvSub3D,NV10_TCL_PRIMITIVE_3D_VERTEX_ARRAY_DATA|NONINC_METHOD,size);
|
||||
else if (nmesa->screen->card->type==NV_20)
|
||||
BEGIN_RING_SIZE(NvSub3D,NV20_TCL_PRIMITIVE_3D_VERTEX_DATA|NONINC_METHOD,size);
|
||||
|
|
@ -76,7 +76,7 @@ static inline void nv10StartPrimitive(struct nouveau_context* nmesa,uint32_t pri
|
|||
|
||||
inline void nv10FinishPrimitive(struct nouveau_context *nmesa)
|
||||
{
|
||||
if (nmesa->screen->card->type==NV_10)
|
||||
if ((nmesa->screen->card->type>=NV_10) && (nmesa->screen->card->type<=NV_17))
|
||||
BEGIN_RING_SIZE(NvSub3D,NV10_TCL_PRIMITIVE_3D_BEGIN_END,1);
|
||||
else if (nmesa->screen->card->type==NV_20)
|
||||
BEGIN_RING_SIZE(NvSub3D,NV20_TCL_PRIMITIVE_3D_BEGIN_END,1);
|
||||
|
|
@ -454,7 +454,7 @@ static inline void nv10OutputVertexFormat(struct nouveau_context* nmesa)
|
|||
/*
|
||||
* Tell the hardware about the vertex format
|
||||
*/
|
||||
if (nmesa->screen->card->type==NV_10) {
|
||||
if ((nmesa->screen->card->type>=NV_10) && (nmesa->screen->card->type<=NV_17)) {
|
||||
int size;
|
||||
|
||||
#define NV_VERTEX_ATTRIBUTE_TYPE_FLOAT 2
|
||||
|
|
|
|||
|
|
@ -568,10 +568,10 @@ static void nv20Scissor(GLcontext *ctx, GLint x, GLint y, GLsizei w, GLsizei h)
|
|||
y += nmesa->drawY;
|
||||
}
|
||||
|
||||
BEGIN_RING_CACHE(NvSub3D, NV20_TCL_PRIMITIVE_3D_SCISSOR_X2_X1, 1);
|
||||
/*BEGIN_RING_CACHE(NvSub3D, NV20_TCL_PRIMITIVE_3D_SCISSOR_X2_X1, 1);
|
||||
OUT_RING_CACHE((w << 16) | x );
|
||||
BEGIN_RING_CACHE(NvSub3D, NV20_TCL_PRIMITIVE_3D_SCISSOR_Y2_Y1, 1);
|
||||
OUT_RING_CACHE((h << 16) | y );
|
||||
OUT_RING_CACHE((h << 16) | y );*/
|
||||
|
||||
}
|
||||
|
||||
|
|
@ -764,11 +764,11 @@ static GLboolean nv20BindBuffers(nouveauContextPtr nmesa, int num_color,
|
|||
}
|
||||
|
||||
/* Always set to bottom left of buffer */
|
||||
BEGIN_RING_CACHE(NvSub3D, NV20_TCL_PRIMITIVE_3D_VIEWPORT_ORIGIN_X, 4);
|
||||
/*BEGIN_RING_CACHE(NvSub3D, NV20_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);
|
||||
OUT_RING_CACHEf (0.0);*/
|
||||
|
||||
return GL_TRUE;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -568,19 +568,10 @@ struct r300_vertex_shader_fragment {
|
|||
union {
|
||||
GLuint d[VSF_MAX_FRAGMENT_LENGTH];
|
||||
float f[VSF_MAX_FRAGMENT_LENGTH];
|
||||
VERTEX_SHADER_INSTRUCTION i[VSF_MAX_FRAGMENT_LENGTH / 4];
|
||||
struct r300_vertprog_instruction i[VSF_MAX_FRAGMENT_LENGTH / 4];
|
||||
} body;
|
||||
};
|
||||
|
||||
#define VSF_DEST_PROGRAM 0x0
|
||||
#define VSF_DEST_MATRIX0 0x200
|
||||
#define VSF_DEST_MATRIX1 0x204
|
||||
#define VSF_DEST_MATRIX2 0x208
|
||||
#define VSF_DEST_VECTOR0 0x20c
|
||||
#define VSF_DEST_VECTOR1 0x20d
|
||||
#define VSF_DEST_UNKNOWN1 0x400
|
||||
#define VSF_DEST_UNKNOWN2 0x406
|
||||
|
||||
struct r300_vertex_shader_state {
|
||||
struct r300_vertex_shader_fragment program;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -299,13 +299,14 @@ GLuint r300VAPOutputCntl0(GLcontext * ctx, GLuint OutputsWritten)
|
|||
if (OutputsWritten & (1 << VERT_RESULT_COL1))
|
||||
ret |= R300_VAP_OUTPUT_VTX_FMT_0__COLOR_1_PRESENT;
|
||||
|
||||
if (OutputsWritten & (1 << VERT_RESULT_BFC0)
|
||||
|| OutputsWritten & (1 << VERT_RESULT_BFC1))
|
||||
ret |=
|
||||
R300_VAP_OUTPUT_VTX_FMT_0__COLOR_1_PRESENT |
|
||||
R300_VAP_OUTPUT_VTX_FMT_0__COLOR_2_PRESENT |
|
||||
R300_VAP_OUTPUT_VTX_FMT_0__COLOR_3_PRESENT;
|
||||
|
||||
#if 0
|
||||
if (OutputsWritten & (1 << VERT_RESULT_BFC0))
|
||||
ret |= R300_VAP_OUTPUT_VTX_FMT_0__COLOR_2_PRESENT;
|
||||
|
||||
if (OutputsWritten & (1 << VERT_RESULT_BFC1))
|
||||
ret |= R300_VAP_OUTPUT_VTX_FMT_0__COLOR_3_PRESENT;
|
||||
|
||||
if (OutputsWritten & (1 << VERT_RESULT_FOGC)) ;
|
||||
#endif
|
||||
|
||||
|
|
|
|||
|
|
@ -282,9 +282,32 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|||
*/
|
||||
#define R300_VAP_PVS_UPLOAD_ADDRESS 0x2200
|
||||
# define R300_PVS_UPLOAD_PROGRAM 0x00000000
|
||||
/* gap */
|
||||
# define R300_PVS_UPLOAD_PARAMETERS 0x00000200
|
||||
/* gap */
|
||||
# define R300_PVS_UPLOAD_CLIP_PLANE0 0x00000400
|
||||
# define R300_PVS_UPLOAD_CLIP_PLANE1 0x00000401
|
||||
# define R300_PVS_UPLOAD_CLIP_PLANE2 0x00000402
|
||||
# define R300_PVS_UPLOAD_CLIP_PLANE3 0x00000403
|
||||
# define R300_PVS_UPLOAD_CLIP_PLANE4 0x00000404
|
||||
# define R300_PVS_UPLOAD_CLIP_PLANE5 0x00000405
|
||||
# define R300_PVS_UPLOAD_POINTSIZE 0x00000406
|
||||
|
||||
/*
|
||||
* These are obsolete defines form r300_context.h, but they might give some
|
||||
* clues when investigating the addresses further...
|
||||
*/
|
||||
#if 0
|
||||
#define VSF_DEST_PROGRAM 0x0
|
||||
#define VSF_DEST_MATRIX0 0x200
|
||||
#define VSF_DEST_MATRIX1 0x204
|
||||
#define VSF_DEST_MATRIX2 0x208
|
||||
#define VSF_DEST_VECTOR0 0x20c
|
||||
#define VSF_DEST_VECTOR1 0x20d
|
||||
#define VSF_DEST_UNKNOWN1 0x400
|
||||
#define VSF_DEST_UNKNOWN2 0x406
|
||||
#endif
|
||||
|
||||
/* gap */
|
||||
|
||||
#define R300_VAP_PVS_UPLOAD_DATA 0x2208
|
||||
|
|
|
|||
|
|
@ -82,6 +82,8 @@ static void r300BlendColor(GLcontext * ctx, const GLfloat cf[4])
|
|||
|
||||
rmesa->hw.blend_color.cmd[1] = PACK_COLOR_8888(color[3], color[0],
|
||||
color[1], color[2]);
|
||||
rmesa->hw.blend_color.cmd[2] = 0;
|
||||
rmesa->hw.blend_color.cmd[3] = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -317,20 +319,34 @@ static void r300UpdateCulling(GLcontext * ctx)
|
|||
r300ContextPtr r300 = R300_CONTEXT(ctx);
|
||||
uint32_t val = 0;
|
||||
|
||||
R300_STATECHANGE(r300, cul);
|
||||
if (ctx->Polygon.CullFlag) {
|
||||
if (ctx->Polygon.CullFaceMode == GL_FRONT_AND_BACK)
|
||||
val = R300_CULL_FRONT | R300_CULL_BACK;
|
||||
else if (ctx->Polygon.CullFaceMode == GL_FRONT)
|
||||
switch (ctx->Polygon.CullFaceMode) {
|
||||
case GL_FRONT:
|
||||
val = R300_CULL_FRONT;
|
||||
else
|
||||
break;
|
||||
case GL_BACK:
|
||||
val = R300_CULL_BACK;
|
||||
|
||||
if (ctx->Polygon.FrontFace == GL_CW)
|
||||
val |= R300_FRONT_FACE_CW;
|
||||
else
|
||||
val |= R300_FRONT_FACE_CCW;
|
||||
break;
|
||||
case GL_FRONT_AND_BACK:
|
||||
val = R300_CULL_FRONT | R300_CULL_BACK;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
switch (ctx->Polygon.FrontFace) {
|
||||
case GL_CW:
|
||||
val |= R300_FRONT_FACE_CW;
|
||||
break;
|
||||
case GL_CCW:
|
||||
val |= R300_FRONT_FACE_CCW;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
R300_STATECHANGE(r300, cul);
|
||||
r300->hw.cul.cmd[R300_CUL_CULL] = val;
|
||||
}
|
||||
|
||||
|
|
@ -344,6 +360,20 @@ static void r300SetEarlyZState(GLcontext * ctx)
|
|||
r300ContextPtr r300 = R300_CONTEXT(ctx);
|
||||
|
||||
R300_STATECHANGE(r300, zstencil_format);
|
||||
switch (ctx->Visual.depthBits) {
|
||||
case 16:
|
||||
r300->hw.zstencil_format.cmd[1] = R300_DEPTH_FORMAT_16BIT_INT_Z;
|
||||
break;
|
||||
case 24:
|
||||
r300->hw.zstencil_format.cmd[1] = R300_DEPTH_FORMAT_24BIT_INT_Z;
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "Error: Unsupported depth %d... exiting\n", ctx->Visual.depthBits);
|
||||
_mesa_exit(-1);
|
||||
}
|
||||
|
||||
// r300->hw.zstencil_format.cmd[1] |= R300_DEPTH_FORMAT_UNK32;
|
||||
|
||||
if (ctx->Color.AlphaEnabled && ctx->Color.AlphaFunc != GL_ALWAYS)
|
||||
/* disable early Z */
|
||||
r300->hw.zstencil_format.cmd[2] = R300_EARLY_Z_DISABLE;
|
||||
|
|
@ -355,6 +385,9 @@ static void r300SetEarlyZState(GLcontext * ctx)
|
|||
/* disable early Z */
|
||||
r300->hw.zstencil_format.cmd[2] = R300_EARLY_Z_DISABLE;
|
||||
}
|
||||
|
||||
r300->hw.zstencil_format.cmd[3] = 0x00000003;
|
||||
r300->hw.zstencil_format.cmd[4] = 0x00000000;
|
||||
}
|
||||
|
||||
static void r300SetAlphaState(GLcontext * ctx)
|
||||
|
|
@ -403,6 +436,7 @@ static void r300SetAlphaState(GLcontext * ctx)
|
|||
|
||||
R300_STATECHANGE(r300, at);
|
||||
r300->hw.at.cmd[R300_AT_ALPHA_TEST] = pp_misc;
|
||||
r300->hw.at.cmd[R300_AT_UNKNOWN] = 0;
|
||||
|
||||
r300SetEarlyZState(ctx);
|
||||
}
|
||||
|
|
@ -513,6 +547,9 @@ static void r300UpdatePolygonMode(GLcontext * ctx)
|
|||
R300_STATECHANGE(r300, polygon_mode);
|
||||
r300->hw.polygon_mode.cmd[1] = hw_mode;
|
||||
}
|
||||
|
||||
r300->hw.polygon_mode.cmd[2] = 0x00000001;
|
||||
r300->hw.polygon_mode.cmd[3] = 0x00000000;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -762,6 +799,7 @@ static void r300ShadeModel(GLcontext * ctx, GLenum mode)
|
|||
r300ContextPtr rmesa = R300_CONTEXT(ctx);
|
||||
|
||||
R300_STATECHANGE(rmesa, shade);
|
||||
rmesa->hw.shade.cmd[1] = 0x00000002;
|
||||
switch (mode) {
|
||||
case GL_FLAT:
|
||||
rmesa->hw.shade.cmd[2] = R300_RE_SHADE_MODEL_FLAT;
|
||||
|
|
@ -772,6 +810,8 @@ static void r300ShadeModel(GLcontext * ctx, GLenum mode)
|
|||
default:
|
||||
return;
|
||||
}
|
||||
rmesa->hw.shade.cmd[3] = 0x00000000;
|
||||
rmesa->hw.shade.cmd[4] = 0x00000000;
|
||||
}
|
||||
|
||||
static void r300StencilFuncSeparate(GLcontext * ctx, GLenum face,
|
||||
|
|
@ -1526,7 +1566,7 @@ static void r300SetupDefaultVertexProgram(r300ContextPtr rmesa)
|
|||
|
||||
for (i = VERT_ATTRIB_POS; i < VERT_ATTRIB_MAX; i++) {
|
||||
if (rmesa->state.sw_tcl_inputs[i] != -1) {
|
||||
prog->program.body.i[program_end].op = EASY_VSF_OP(MUL, o_reg++, ALL, RESULT);
|
||||
prog->program.body.i[program_end].opcode = EASY_VSF_OP(MUL, o_reg++, ALL, RESULT);
|
||||
prog->program.body.i[program_end].src[0] = VSF_REG(rmesa->state.sw_tcl_inputs[i]);
|
||||
prog->program.body.i[program_end].src[1] = VSF_ATTR_UNITY(rmesa->state.sw_tcl_inputs[i]);
|
||||
prog->program.body.i[program_end].src[2] = VSF_UNITY(rmesa->state.sw_tcl_inputs[i]);
|
||||
|
|
@ -1536,7 +1576,7 @@ static void r300SetupDefaultVertexProgram(r300ContextPtr rmesa)
|
|||
|
||||
prog->program.length = program_end * 4;
|
||||
|
||||
r300SetupVertexProgramFragment(rmesa, VSF_DEST_PROGRAM, &(prog->program));
|
||||
r300SetupVertexProgramFragment(rmesa, R300_PVS_UPLOAD_PROGRAM, &(prog->program));
|
||||
inst_count = (prog->program.length / 4) - 1;
|
||||
|
||||
R300_STATECHANGE(rmesa, pvs);
|
||||
|
|
@ -1570,7 +1610,7 @@ static void r300SetupRealVertexProgram(r300ContextPtr rmesa)
|
|||
bump_vpu_count(rmesa->hw.vpp.cmd, param_count);
|
||||
param_count /= 4;
|
||||
|
||||
r300SetupVertexProgramFragment(rmesa, VSF_DEST_PROGRAM, &(prog->program));
|
||||
r300SetupVertexProgramFragment(rmesa, R300_PVS_UPLOAD_PROGRAM, &(prog->program));
|
||||
inst_count = (prog->program.length / 4) - 1;
|
||||
|
||||
R300_STATECHANGE(rmesa, pvs);
|
||||
|
|
@ -1848,15 +1888,10 @@ static void r300ResetHwState(r300ContextPtr r300)
|
|||
r300->hw.unk4260.cmd[2] = r300PackFloat32(0.0);
|
||||
r300->hw.unk4260.cmd[3] = r300PackFloat32(1.0);
|
||||
|
||||
r300->hw.shade.cmd[1] = 0x00000002;
|
||||
r300ShadeModel(ctx, ctx->Light.ShadeModel);
|
||||
r300->hw.shade.cmd[3] = 0x00000000;
|
||||
r300->hw.shade.cmd[4] = 0x00000000;
|
||||
|
||||
r300PolygonMode(ctx, GL_FRONT, ctx->Polygon.FrontMode);
|
||||
r300PolygonMode(ctx, GL_BACK, ctx->Polygon.BackMode);
|
||||
r300->hw.polygon_mode.cmd[2] = 0x00000001;
|
||||
r300->hw.polygon_mode.cmd[3] = 0x00000000;
|
||||
r300->hw.zbias_cntl.cmd[1] = 0x00000000;
|
||||
|
||||
r300PolygonOffset(ctx, ctx->Polygon.OffsetFactor,
|
||||
|
|
@ -1887,14 +1922,11 @@ static void r300ResetHwState(r300ContextPtr r300)
|
|||
r300Fogfv(ctx, GL_FOG_COLOR, ctx->Fog.Color);
|
||||
r300Fogfv(ctx, GL_FOG_COORDINATE_SOURCE_EXT, NULL);
|
||||
|
||||
r300->hw.at.cmd[R300_AT_UNKNOWN] = 0;
|
||||
r300->hw.unk4BD8.cmd[1] = 0;
|
||||
|
||||
r300->hw.unk4E00.cmd[1] = 0;
|
||||
|
||||
r300BlendColor(ctx, ctx->Color.BlendColor);
|
||||
r300->hw.blend_color.cmd[2] = 0;
|
||||
r300->hw.blend_color.cmd[3] = 0;
|
||||
|
||||
/* Again, r300ClearBuffer uses this */
|
||||
r300->hw.cb.cmd[R300_CB_OFFSET] =
|
||||
|
|
@ -1925,25 +1957,6 @@ static void r300ResetHwState(r300ContextPtr r300)
|
|||
r300->hw.unk4EA0.cmd[1] = 0x00000000;
|
||||
r300->hw.unk4EA0.cmd[2] = 0xffffffff;
|
||||
|
||||
switch (ctx->Visual.depthBits) {
|
||||
case 16:
|
||||
r300->hw.zstencil_format.cmd[1] = R300_DEPTH_FORMAT_16BIT_INT_Z;
|
||||
break;
|
||||
case 24:
|
||||
r300->hw.zstencil_format.cmd[1] = R300_DEPTH_FORMAT_24BIT_INT_Z;
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "Error: Unsupported depth %d... exiting\n",
|
||||
ctx->Visual.depthBits);
|
||||
_mesa_exit(-1);
|
||||
|
||||
}
|
||||
/* z compress? */
|
||||
//r300->hw.zstencil_format.cmd[1] |= R300_DEPTH_FORMAT_UNK32;
|
||||
|
||||
r300->hw.zstencil_format.cmd[3] = 0x00000003;
|
||||
r300->hw.zstencil_format.cmd[4] = 0x00000000;
|
||||
|
||||
r300->hw.zb.cmd[R300_ZB_OFFSET] =
|
||||
r300->radeon.radeonScreen->depthOffset +
|
||||
r300->radeon.radeonScreen->fbLocation;
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -3,10 +3,10 @@
|
|||
|
||||
#include "r300_reg.h"
|
||||
|
||||
typedef struct {
|
||||
GLuint op;
|
||||
struct r300_vertprog_instruction {
|
||||
GLuint opcode;
|
||||
GLuint src[3];
|
||||
} VERTEX_SHADER_INSTRUCTION;
|
||||
};
|
||||
|
||||
#define VSF_FLAG_X 1
|
||||
#define VSF_FLAG_Y 2
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.1
|
||||
* Version: 7.0.1
|
||||
*
|
||||
* Copyright (C) 1999-2003 Brian Paul All Rights Reserved.
|
||||
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
|
|
@ -100,6 +100,11 @@ _mesa_validate_DrawElements(GLcontext *ctx,
|
|||
(const GLubyte *) indices);
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* not using a VBO */
|
||||
if (!indices)
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
if (ctx->Const.CheckArrayBounds) {
|
||||
/* find max array index */
|
||||
|
|
@ -170,6 +175,16 @@ _mesa_validate_DrawRangeElements(GLcontext *ctx, GLenum mode,
|
|||
&& !(ctx->VertexProgram._Enabled && ctx->Array.ArrayObj->VertexAttrib[0].Enabled))
|
||||
return GL_FALSE;
|
||||
|
||||
/* Vertex buffer object tests */
|
||||
if (ctx->Array.ElementArrayBufferObj->Name) {
|
||||
/* XXX re-use code from above? */
|
||||
}
|
||||
else {
|
||||
/* not using VBO */
|
||||
if (!indices)
|
||||
return GL_FALSE;
|
||||
}
|
||||
|
||||
if (ctx->Const.CheckArrayBounds) {
|
||||
/* Find max array index.
|
||||
* We don't trust the user's start and end values.
|
||||
|
|
|
|||
|
|
@ -1495,9 +1495,20 @@ _mesa_make_current( GLcontext *newCtx, GLframebuffer *drawBuffer,
|
|||
*/
|
||||
if (!newCtx->DrawBuffer || newCtx->DrawBuffer->Name == 0) {
|
||||
_mesa_reference_framebuffer(&newCtx->DrawBuffer, drawBuffer);
|
||||
/* fix up the fb fields - these will end up wrong otherwise
|
||||
if the DRIdrawable changes, and someone may rely on them.
|
||||
*/
|
||||
/* What a mess!?! */
|
||||
int i;
|
||||
GLenum buffers[MAX_DRAW_BUFFERS];
|
||||
for(i = 0; i < newCtx->Const.MaxDrawBuffers; i++) {
|
||||
buffers[i] = newCtx->Color.DrawBuffer[i];
|
||||
}
|
||||
_mesa_drawbuffers(newCtx, newCtx->Const.MaxDrawBuffers, buffers, NULL);
|
||||
}
|
||||
if (!newCtx->ReadBuffer || newCtx->ReadBuffer->Name == 0) {
|
||||
_mesa_reference_framebuffer(&newCtx->ReadBuffer, readBuffer);
|
||||
_mesa_ReadBuffer(newCtx->Pixel.ReadBuffer);
|
||||
}
|
||||
|
||||
newCtx->NewState |= _NEW_BUFFERS;
|
||||
|
|
|
|||
|
|
@ -65,7 +65,9 @@ compute_depth_max(struct gl_framebuffer *fb)
|
|||
fb->_DepthMax = 0xffffffff;
|
||||
}
|
||||
fb->_DepthMaxF = (GLfloat) fb->_DepthMax;
|
||||
fb->_MRD = 1.0; /* Minimum resolvable depth value, for polygon offset */
|
||||
|
||||
/* Minimum resolvable depth value, for polygon offset */
|
||||
fb->_MRD = 1.0 / fb->_DepthMaxF;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -3882,9 +3882,19 @@ _mesa_pack_stencil_span( const GLcontext *ctx, GLuint n,
|
|||
} \
|
||||
} while (0)
|
||||
|
||||
|
||||
/**
|
||||
* Unpack a row of depth/z values from memory, returning GLushort, GLuint
|
||||
* or GLfloat values.
|
||||
* The glPixelTransfer (scale/bias) params will be applied.
|
||||
*
|
||||
* \param dstType one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
|
||||
* \param depthMax max value for returned GLushort or GLuint values
|
||||
* (ignored for GLfloat).
|
||||
*/
|
||||
void
|
||||
_mesa_unpack_depth_span( const GLcontext *ctx, GLuint n,
|
||||
GLenum dstType, GLvoid *dest, GLfloat depthScale,
|
||||
GLenum dstType, GLvoid *dest, GLuint depthMax,
|
||||
GLenum srcType, const GLvoid *source,
|
||||
const struct gl_pixelstore_attrib *srcPacking )
|
||||
{
|
||||
|
|
@ -3907,7 +3917,9 @@ _mesa_unpack_depth_span( const GLcontext *ctx, GLuint n,
|
|||
}
|
||||
return;
|
||||
}
|
||||
if (srcType == GL_UNSIGNED_SHORT && dstType == GL_UNSIGNED_INT) {
|
||||
if (srcType == GL_UNSIGNED_SHORT
|
||||
&& dstType == GL_UNSIGNED_INT
|
||||
&& depthMax == 0xffffffff) {
|
||||
const GLushort *src = (const GLushort *) source;
|
||||
GLuint *dst = (GLuint *) dest;
|
||||
GLuint i;
|
||||
|
|
@ -3955,7 +3967,7 @@ _mesa_unpack_depth_span( const GLcontext *ctx, GLuint n,
|
|||
break;
|
||||
case GL_UNSIGNED_INT_24_8_EXT: /* GL_EXT_packed_depth_stencil */
|
||||
if (dstType == GL_UNSIGNED_INT &&
|
||||
depthScale == (GLfloat) 0xffffff &&
|
||||
depthMax == 0xffffff &&
|
||||
ctx->Pixel.DepthScale == 1.0 &&
|
||||
ctx->Pixel.DepthBias == 0.0) {
|
||||
const GLuint *src = (const GLuint *) source;
|
||||
|
|
@ -4033,16 +4045,16 @@ _mesa_unpack_depth_span( const GLcontext *ctx, GLuint n,
|
|||
if (dstType == GL_UNSIGNED_INT) {
|
||||
GLuint *zValues = (GLuint *) dest;
|
||||
GLuint i;
|
||||
if (depthScale <= (GLfloat) 0xffffff) {
|
||||
if (depthMax <= 0xffffff) {
|
||||
/* no overflow worries */
|
||||
for (i = 0; i < n; i++) {
|
||||
zValues[i] = (GLuint) (depthValues[i] * depthScale);
|
||||
zValues[i] = (GLuint) (depthValues[i] * (GLfloat) depthMax);
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* need to use double precision to prevent overflow problems */
|
||||
for (i = 0; i < n; i++) {
|
||||
GLdouble z = depthValues[i] * depthScale;
|
||||
GLdouble z = depthValues[i] * (GLfloat) depthMax;
|
||||
if (z >= (GLdouble) 0xffffffff)
|
||||
zValues[i] = 0xffffffff;
|
||||
else
|
||||
|
|
@ -4053,14 +4065,14 @@ _mesa_unpack_depth_span( const GLcontext *ctx, GLuint n,
|
|||
else if (dstType == GL_UNSIGNED_SHORT) {
|
||||
GLushort *zValues = (GLushort *) dest;
|
||||
GLuint i;
|
||||
ASSERT(depthScale <= 65535.0);
|
||||
ASSERT(depthMax <= 0xffff);
|
||||
for (i = 0; i < n; i++) {
|
||||
zValues[i] = (GLushort) (depthValues[i] * depthScale);
|
||||
zValues[i] = (GLushort) (depthValues[i] * (GLfloat) depthMax);
|
||||
}
|
||||
}
|
||||
else {
|
||||
ASSERT(dstType == GL_FLOAT);
|
||||
ASSERT(depthScale == 1.0F);
|
||||
/*ASSERT(depthMax == 1.0F);*/
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5.2
|
||||
* Version: 7.1
|
||||
*
|
||||
* Copyright (C) 1999-2006 Brian Paul All Rights Reserved.
|
||||
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
|
|
@ -181,7 +181,7 @@ _mesa_pack_stencil_span( const GLcontext *ctx, GLuint n,
|
|||
|
||||
extern void
|
||||
_mesa_unpack_depth_span( const GLcontext *ctx, GLuint n,
|
||||
GLenum dstType, GLvoid *dest, GLfloat depthScale,
|
||||
GLenum dstType, GLvoid *dest, GLuint depthMax,
|
||||
GLenum srcType, const GLvoid *source,
|
||||
const struct gl_pixelstore_attrib *srcPacking );
|
||||
|
||||
|
|
|
|||
|
|
@ -1264,6 +1264,10 @@ _mesa_init_teximage_fields(GLcontext *ctx, GLenum target,
|
|||
* A hardware driver might override this function if, for example, the
|
||||
* max 3D texture size is 512x512x64 (i.e. not a cube).
|
||||
*
|
||||
* Note that width, height, depth == 0 is not an error. However, a
|
||||
* texture with zero width/height/depth will be considered "incomplete"
|
||||
* and texturing will effectively be disabled.
|
||||
*
|
||||
* \param target one of GL_PROXY_TEXTURE_1D, GL_PROXY_TEXTURE_2D,
|
||||
* GL_PROXY_TEXTURE_3D, GL_PROXY_TEXTURE_RECTANGLE_NV,
|
||||
* GL_PROXY_TEXTURE_CUBE_MAP_ARB.
|
||||
|
|
@ -1293,7 +1297,7 @@ _mesa_test_proxy_teximage(GLcontext *ctx, GLenum target, GLint level,
|
|||
maxSize = 1 << (ctx->Const.MaxTextureLevels - 1);
|
||||
if (width < 2 * border || width > 2 + maxSize ||
|
||||
(!ctx->Extensions.ARB_texture_non_power_of_two &&
|
||||
_mesa_bitcount(width - 2 * border) != 1) ||
|
||||
width >0 && _mesa_bitcount(width - 2 * border) != 1) ||
|
||||
level >= ctx->Const.MaxTextureLevels) {
|
||||
/* bad width or level */
|
||||
return GL_FALSE;
|
||||
|
|
@ -1303,10 +1307,10 @@ _mesa_test_proxy_teximage(GLcontext *ctx, GLenum target, GLint level,
|
|||
maxSize = 1 << (ctx->Const.MaxTextureLevels - 1);
|
||||
if (width < 2 * border || width > 2 + maxSize ||
|
||||
(!ctx->Extensions.ARB_texture_non_power_of_two &&
|
||||
_mesa_bitcount(width - 2 * border) != 1) ||
|
||||
width > 0 && _mesa_bitcount(width - 2 * border) != 1) ||
|
||||
height < 2 * border || height > 2 + maxSize ||
|
||||
(!ctx->Extensions.ARB_texture_non_power_of_two &&
|
||||
_mesa_bitcount(height - 2 * border) != 1) ||
|
||||
height > 0 && _mesa_bitcount(height - 2 * border) != 1) ||
|
||||
level >= ctx->Const.MaxTextureLevels) {
|
||||
/* bad width or height or level */
|
||||
return GL_FALSE;
|
||||
|
|
@ -1316,21 +1320,21 @@ _mesa_test_proxy_teximage(GLcontext *ctx, GLenum target, GLint level,
|
|||
maxSize = 1 << (ctx->Const.Max3DTextureLevels - 1);
|
||||
if (width < 2 * border || width > 2 + maxSize ||
|
||||
(!ctx->Extensions.ARB_texture_non_power_of_two &&
|
||||
_mesa_bitcount(width - 2 * border) != 1) ||
|
||||
width > 0 && _mesa_bitcount(width - 2 * border) != 1) ||
|
||||
height < 2 * border || height > 2 + maxSize ||
|
||||
(!ctx->Extensions.ARB_texture_non_power_of_two &&
|
||||
_mesa_bitcount(height - 2 * border) != 1) ||
|
||||
height > 0 && _mesa_bitcount(height - 2 * border) != 1) ||
|
||||
depth < 2 * border || depth > 2 + maxSize ||
|
||||
(!ctx->Extensions.ARB_texture_non_power_of_two &&
|
||||
_mesa_bitcount(depth - 2 * border) != 1) ||
|
||||
depth > 0 && _mesa_bitcount(depth - 2 * border) != 1) ||
|
||||
level >= ctx->Const.Max3DTextureLevels) {
|
||||
/* bad width or height or depth or level */
|
||||
return GL_FALSE;
|
||||
}
|
||||
return GL_TRUE;
|
||||
case GL_PROXY_TEXTURE_RECTANGLE_NV:
|
||||
if (width < 1 || width > ctx->Const.MaxTextureRectSize ||
|
||||
height < 1 || height > ctx->Const.MaxTextureRectSize ||
|
||||
if (width < 0 || width > ctx->Const.MaxTextureRectSize ||
|
||||
height < 0 || height > ctx->Const.MaxTextureRectSize ||
|
||||
level != 0) {
|
||||
/* bad width or height or level */
|
||||
return GL_FALSE;
|
||||
|
|
@ -1340,10 +1344,10 @@ _mesa_test_proxy_teximage(GLcontext *ctx, GLenum target, GLint level,
|
|||
maxSize = 1 << (ctx->Const.MaxCubeTextureLevels - 1);
|
||||
if (width < 2 * border || width > 2 + maxSize ||
|
||||
(!ctx->Extensions.ARB_texture_non_power_of_two &&
|
||||
_mesa_bitcount(width - 2 * border) != 1) ||
|
||||
width > 0 && _mesa_bitcount(width - 2 * border) != 1) ||
|
||||
height < 2 * border || height > 2 + maxSize ||
|
||||
(!ctx->Extensions.ARB_texture_non_power_of_two &&
|
||||
_mesa_bitcount(height - 2 * border) != 1) ||
|
||||
height > 0 && _mesa_bitcount(height - 2 * border) != 1) ||
|
||||
level >= ctx->Const.MaxCubeTextureLevels) {
|
||||
/* bad width or height */
|
||||
return GL_FALSE;
|
||||
|
|
@ -1353,7 +1357,7 @@ _mesa_test_proxy_teximage(GLcontext *ctx, GLenum target, GLint level,
|
|||
maxSize = 1 << (ctx->Const.MaxTextureLevels - 1);
|
||||
if (width < 2 * border || width > 2 + maxSize ||
|
||||
(!ctx->Extensions.ARB_texture_non_power_of_two &&
|
||||
_mesa_bitcount(width - 2 * border) != 1) ||
|
||||
width > 0 && _mesa_bitcount(width - 2 * border) != 1) ||
|
||||
level >= ctx->Const.MaxTextureLevels) {
|
||||
/* bad width or level */
|
||||
return GL_FALSE;
|
||||
|
|
@ -1367,10 +1371,10 @@ _mesa_test_proxy_teximage(GLcontext *ctx, GLenum target, GLint level,
|
|||
maxSize = 1 << (ctx->Const.MaxTextureLevels - 1);
|
||||
if (width < 2 * border || width > 2 + maxSize ||
|
||||
(!ctx->Extensions.ARB_texture_non_power_of_two &&
|
||||
_mesa_bitcount(width - 2 * border) != 1) ||
|
||||
width > 0 && _mesa_bitcount(width - 2 * border) != 1) ||
|
||||
height < 2 * border || height > 2 + maxSize ||
|
||||
(!ctx->Extensions.ARB_texture_non_power_of_two &&
|
||||
_mesa_bitcount(height - 2 * border) != 1) ||
|
||||
height > 0 && _mesa_bitcount(height - 2 * border) != 1) ||
|
||||
level >= ctx->Const.MaxTextureLevels) {
|
||||
/* bad width or height or level */
|
||||
return GL_FALSE;
|
||||
|
|
@ -1472,7 +1476,7 @@ texture_error_check( GLcontext *ctx, GLenum target,
|
|||
if (target == GL_PROXY_TEXTURE_1D || target == GL_TEXTURE_1D) {
|
||||
proxy_target = GL_PROXY_TEXTURE_1D;
|
||||
height = 1;
|
||||
width = 1;
|
||||
depth = 1;
|
||||
}
|
||||
else {
|
||||
_mesa_error( ctx, GL_INVALID_ENUM, "glTexImage1D(target)" );
|
||||
|
|
|
|||
|
|
@ -1077,7 +1077,7 @@ _mesa_texstore_rgba(TEXSTORE_PARAMS)
|
|||
GLboolean
|
||||
_mesa_texstore_z32(TEXSTORE_PARAMS)
|
||||
{
|
||||
const GLfloat depthScale = (GLfloat) 0xffffffff;
|
||||
const GLuint depthScale = 0xffffffff;
|
||||
(void) dims;
|
||||
ASSERT(dstFormat == &_mesa_texformat_z32);
|
||||
ASSERT(dstFormat->TexelBytes == sizeof(GLuint));
|
||||
|
|
@ -1124,7 +1124,7 @@ _mesa_texstore_z32(TEXSTORE_PARAMS)
|
|||
GLboolean
|
||||
_mesa_texstore_z16(TEXSTORE_PARAMS)
|
||||
{
|
||||
const GLfloat depthScale = 65535.0f;
|
||||
const GLuint depthScale = 0xffff;
|
||||
(void) dims;
|
||||
ASSERT(dstFormat == &_mesa_texformat_z16);
|
||||
ASSERT(dstFormat->TexelBytes == sizeof(GLushort));
|
||||
|
|
@ -2319,6 +2319,8 @@ _mesa_texstore_ycbcr(TEXSTORE_PARAMS)
|
|||
GLboolean
|
||||
_mesa_texstore_z24_s8(TEXSTORE_PARAMS)
|
||||
{
|
||||
const GLuint depthScale = 0xffffff;
|
||||
|
||||
ASSERT(dstFormat == &_mesa_texformat_z24_s8);
|
||||
ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT);
|
||||
ASSERT(srcType == GL_UNSIGNED_INT_24_8_EXT);
|
||||
|
|
@ -2357,7 +2359,7 @@ _mesa_texstore_z24_s8(TEXSTORE_PARAMS)
|
|||
_mesa_unpack_depth_span(ctx, srcWidth,
|
||||
GL_UNSIGNED_INT, /* dst type */
|
||||
dstRow, /* dst addr */
|
||||
(GLfloat) 0xffffff, /* depthScale */
|
||||
depthScale,
|
||||
srcType, src, srcPacking);
|
||||
/* get the 8-bit stencil values */
|
||||
_mesa_unpack_stencil_span(ctx, srcWidth,
|
||||
|
|
|
|||
|
|
@ -121,8 +121,11 @@ struct pipe_clip_state {
|
|||
GLuint nr;
|
||||
};
|
||||
|
||||
|
||||
struct pipe_fs_state {
|
||||
struct gl_fragment_program *fp;
|
||||
GLuint inputs_read; /* FRAG_ATTRIB_* */
|
||||
const struct tgsi_token *tokens;
|
||||
|
||||
};
|
||||
|
||||
struct pipe_constant_buffer {
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@
|
|||
#include "sp_context.h"
|
||||
#include "sp_headers.h"
|
||||
#include "sp_quad.h"
|
||||
#include "core/tgsi_core.h"
|
||||
|
||||
struct exec_machine {
|
||||
const struct setup_coefficient *coef; /**< will point to quad->coef */
|
||||
|
|
@ -180,8 +181,47 @@ shade_quad( struct quad_stage *qs, struct quad_header *quad )
|
|||
#endif
|
||||
}
|
||||
|
||||
#if 0
|
||||
softpipe->run_fs( tri->fp, quad, &tri->outputs );
|
||||
#if 1
|
||||
/*softpipe->run_fs( tri->fp, quad, &tri->outputs );*/
|
||||
|
||||
{
|
||||
struct tgsi_exec_machine machine;
|
||||
struct tgsi_exec_vector inputs[FRAG_ATTRIB_MAX + 1];
|
||||
struct tgsi_exec_vector outputs[FRAG_ATTRIB_MAX + 1];
|
||||
struct tgsi_exec_vector *ainputs;
|
||||
struct tgsi_exec_vector *aoutputs;
|
||||
GLuint i, total;
|
||||
|
||||
ainputs = (struct tgsi_exec_vector *) tgsi_align_128bit( inputs );
|
||||
aoutputs = (struct tgsi_exec_vector *) tgsi_align_128bit( outputs );
|
||||
|
||||
for( i = total = 0; i < PIPE_ATTRIB_MAX; i++ ) {
|
||||
GLuint attr;
|
||||
|
||||
attr = softpipe->fp_attr_to_slot[i];
|
||||
if( attr ) {
|
||||
assert( total < FRAG_ATTRIB_MAX );
|
||||
assert( attr < FRAG_ATTRIB_MAX );
|
||||
assert( sizeof( ainputs[0] ) == sizeof( exec.attr[0] ) );
|
||||
|
||||
memcpy(
|
||||
&ainputs[total],
|
||||
exec.attr[attr],
|
||||
sizeof( ainputs[0] ) );
|
||||
total++;
|
||||
}
|
||||
}
|
||||
|
||||
tgsi_exec_machine_init(
|
||||
&machine,
|
||||
softpipe->fs.tokens );
|
||||
|
||||
machine.Inputs = ainputs;
|
||||
machine.Outputs = aoutputs;
|
||||
|
||||
tgsi_exec_machine_run(
|
||||
&machine );
|
||||
}
|
||||
#else
|
||||
{
|
||||
GLuint attr = softpipe->fp_attr_to_slot[FRAG_ATTRIB_COL0];
|
||||
|
|
|
|||
|
|
@ -28,7 +28,6 @@
|
|||
#include "main/glheader.h"
|
||||
#include "main/macros.h"
|
||||
#include "main/enums.h"
|
||||
#include "shader/program.h"
|
||||
|
||||
#include "vf/vf.h"
|
||||
#include "pipe/draw/draw_context.h"
|
||||
|
|
@ -68,8 +67,7 @@ static const GLuint frag_to_vf[FRAG_ATTRIB_MAX] =
|
|||
*/
|
||||
static void calculate_vertex_layout( struct softpipe_context *softpipe )
|
||||
{
|
||||
struct gl_fragment_program *fp = softpipe->fs.fp;
|
||||
const GLuint inputsRead = fp->Base.InputsRead;
|
||||
const GLuint inputsRead = softpipe->fs.inputs_read;
|
||||
GLuint slot_to_vf_attr[VF_ATTRIB_MAX];
|
||||
GLbitfield attr_mask = 0x0;
|
||||
GLuint i;
|
||||
|
|
|
|||
|
|
@ -400,12 +400,16 @@ tgsi_dump(
|
|||
GLuint deflt = !(flags & TGSI_DUMP_NO_DEFAULT);
|
||||
|
||||
{
|
||||
#if 0
|
||||
static GLuint counter = 0;
|
||||
char buffer[64];
|
||||
|
||||
sprintf( buffer, "sbir-dump-%.4u.txt", counter++ );
|
||||
dump.file = fopen( buffer, "wt" );
|
||||
#else
|
||||
dump.file = stderr;
|
||||
dump.tabs = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
tgsi_parse_init( &parse, tokens );
|
||||
|
|
|
|||
|
|
@ -1,15 +1,22 @@
|
|||
#include "tgsi_platform.h"
|
||||
#include "tgsi_core.h"
|
||||
|
||||
union pointer_hack
|
||||
{
|
||||
void *pointer;
|
||||
unsigned long long uint64;
|
||||
};
|
||||
|
||||
void *
|
||||
tgsi_align_128bit(
|
||||
void *unaligned )
|
||||
{
|
||||
GLuint *ptr, addr;
|
||||
union pointer_hack ph;
|
||||
|
||||
ptr = (GLuint *) unaligned;
|
||||
addr = (*(GLuint *) &ptr + 15) & ~15;
|
||||
return *(void **) &addr;
|
||||
ph.uint64 = 0;
|
||||
ph.pointer = unaligned;
|
||||
ph.uint64 = (ph.uint64 + 15) & ~15;
|
||||
return ph.pointer;
|
||||
}
|
||||
|
||||
GLuint
|
||||
|
|
|
|||
|
|
@ -5,6 +5,8 @@
|
|||
extern "C" {
|
||||
#endif // defined __cplusplus
|
||||
|
||||
struct tgsi_token;
|
||||
|
||||
GLboolean
|
||||
tgsi_mesa_compile_fp_program(
|
||||
const struct gl_fragment_program *program,
|
||||
|
|
|
|||
|
|
@ -779,7 +779,7 @@ _mesa_get_programiv(GLcontext *ctx, GLuint program,
|
|||
*params = shProg->Validated;
|
||||
break;
|
||||
case GL_INFO_LOG_LENGTH:
|
||||
*params = shProg->InfoLog ? strlen(shProg->InfoLog) : 0;
|
||||
*params = shProg->InfoLog ? strlen(shProg->InfoLog) + 1 : 0;
|
||||
break;
|
||||
case GL_ATTACHED_SHADERS:
|
||||
*params = shProg->NumShaders;
|
||||
|
|
@ -831,10 +831,10 @@ _mesa_get_shaderiv(GLcontext *ctx, GLuint name, GLenum pname, GLint *params)
|
|||
*params = shader->CompileStatus;
|
||||
break;
|
||||
case GL_INFO_LOG_LENGTH:
|
||||
*params = shader->InfoLog ? strlen(shader->InfoLog) : 0;
|
||||
*params = shader->InfoLog ? strlen(shader->InfoLog) + 1 : 0;
|
||||
break;
|
||||
case GL_SHADER_SOURCE_LENGTH:
|
||||
*params = shader->Source ? strlen((char *) shader->Source) : 0;
|
||||
*params = shader->Source ? strlen((char *) shader->Source) + 1 : 0;
|
||||
break;
|
||||
default:
|
||||
_mesa_error(ctx, GL_INVALID_ENUM, "glGetShaderiv(pname)");
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5.3
|
||||
* Version: 7.1
|
||||
*
|
||||
* Copyright (C) 2005-2007 Brian Paul All Rights Reserved.
|
||||
*
|
||||
|
|
@ -2328,7 +2328,8 @@ _slang_gen_field(slang_assemble_ctx * A, slang_operation *oper)
|
|||
n = _slang_gen_swizzle(n, swizzle);
|
||||
return n;
|
||||
}
|
||||
else if (ti.spec.type == SLANG_SPEC_FLOAT) {
|
||||
else if ( ti.spec.type == SLANG_SPEC_FLOAT
|
||||
|| ti.spec.type == SLANG_SPEC_INT) {
|
||||
const GLuint rows = 1;
|
||||
slang_swizzle swz;
|
||||
slang_ir_node *n;
|
||||
|
|
|
|||
|
|
@ -206,6 +206,7 @@ STATETRACKER_SOURCES = \
|
|||
state_tracker/st_atom_clip.c \
|
||||
state_tracker/st_atom_depth.c \
|
||||
state_tracker/st_atom_fs.c \
|
||||
state_tracker/st_atom_vs.c \
|
||||
state_tracker/st_atom_framebuffer.c \
|
||||
state_tracker/st_atom_sampler.c \
|
||||
state_tracker/st_atom_scissor.c \
|
||||
|
|
|
|||
|
|
@ -46,6 +46,7 @@ static const struct st_tracked_state *atoms[] =
|
|||
&st_update_clear_color,
|
||||
&st_update_depth,
|
||||
&st_update_clip,
|
||||
&st_update_vs,
|
||||
&st_update_fs,
|
||||
&st_update_setup,
|
||||
&st_update_polygon_stipple,
|
||||
|
|
|
|||
|
|
@ -49,6 +49,7 @@ const struct st_tracked_state st_update_clip;
|
|||
const struct st_tracked_state st_update_clear_color;
|
||||
const struct st_tracked_state st_update_depth;
|
||||
const struct st_tracked_state st_update_fs;
|
||||
const struct st_tracked_state st_update_vs;
|
||||
const struct st_tracked_state st_update_setup;
|
||||
const struct st_tracked_state st_update_polygon_stipple;
|
||||
const struct st_tracked_state st_update_viewport;
|
||||
|
|
|
|||
|
|
@ -32,15 +32,38 @@
|
|||
#include "st_context.h"
|
||||
#include "pipe/p_context.h"
|
||||
#include "st_atom.h"
|
||||
#include "st_program.h"
|
||||
#include "pipe/tgsi/mesa/mesa_to_tgsi.h"
|
||||
#include "pipe/tgsi/core/tgsi_dump.h"
|
||||
|
||||
static void compile_fs( struct st_context *st,
|
||||
struct st_fragment_program *fs )
|
||||
{
|
||||
/* XXX: fix static allocation of tokens:
|
||||
*/
|
||||
tgsi_mesa_compile_fp_program( &fs->Base, fs->tokens, ST_FP_MAX_TOKENS );
|
||||
|
||||
tgsi_dump( fs->tokens, TGSI_DUMP_VERBOSE );
|
||||
}
|
||||
|
||||
|
||||
static void update_fs( struct st_context *st )
|
||||
{
|
||||
struct pipe_fs_state fs;
|
||||
struct st_fragment_program *fp = st_fragment_program(st->ctx->FragmentProgram._Current);
|
||||
|
||||
fs.fp = st->ctx->FragmentProgram._Current;
|
||||
memset( &fs, 0, sizeof(fs) );
|
||||
|
||||
if (fp->dirty)
|
||||
compile_fs( st, fp );
|
||||
|
||||
if (memcmp(&fs, &st->state.fs, sizeof(fs)) != 0) {
|
||||
fs.inputs_read = fp->Base.Base.InputsRead;
|
||||
fs.tokens = &fp->tokens[0];
|
||||
|
||||
if (memcmp(&fs, &st->state.fs, sizeof(fs)) != 0 ||
|
||||
fp->dirty)
|
||||
{
|
||||
fp->dirty = 0;
|
||||
st->state.fs = fs;
|
||||
st->pipe->set_fs_state(st->pipe, &fs);
|
||||
}
|
||||
|
|
|
|||
49
src/mesa/state_tracker/st_atom_vs.c
Normal file
49
src/mesa/state_tracker/st_atom_vs.c
Normal file
|
|
@ -0,0 +1,49 @@
|
|||
/**************************************************************************
|
||||
*
|
||||
* Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
|
||||
* All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the
|
||||
* "Software"), to deal in the Software without restriction, including
|
||||
* without limitation the rights to use, copy, modify, merge, publish,
|
||||
* distribute, sub license, and/or sell copies of the Software, and to
|
||||
* permit persons to whom the Software is furnished to do so, subject to
|
||||
* the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice (including the
|
||||
* next paragraph) shall be included in all copies or substantial portions
|
||||
* of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
|
||||
* IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
|
||||
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||||
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||||
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
**************************************************************************/
|
||||
/*
|
||||
* Authors:
|
||||
* Keith Whitwell <keith@tungstengraphics.com>
|
||||
*/
|
||||
|
||||
#include "st_context.h"
|
||||
#include "pipe/p_context.h"
|
||||
#include "st_atom.h"
|
||||
|
||||
|
||||
|
||||
static void update_vs( struct st_context *st )
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
const struct st_tracked_state st_update_vs = {
|
||||
.dirty = {
|
||||
.mesa = 0,
|
||||
.st = ST_NEW_VERTEX_PROGRAM,
|
||||
},
|
||||
.update = update_vs
|
||||
};
|
||||
|
|
@ -52,6 +52,7 @@ static void st_bind_program( GLcontext *ctx,
|
|||
|
||||
switch (target) {
|
||||
case GL_VERTEX_PROGRAM_ARB:
|
||||
st->dirty.st |= ST_NEW_VERTEX_PROGRAM;
|
||||
break;
|
||||
case GL_FRAGMENT_PROGRAM_ARB:
|
||||
st->dirty.st |= ST_NEW_FRAGMENT_PROGRAM;
|
||||
|
|
@ -66,16 +67,23 @@ static struct gl_program *st_new_program( GLcontext *ctx,
|
|||
struct st_context *st = st_context(ctx);
|
||||
|
||||
switch (target) {
|
||||
case GL_VERTEX_PROGRAM_ARB:
|
||||
return _mesa_init_vertex_program(ctx,
|
||||
CALLOC_STRUCT(gl_vertex_program),
|
||||
target,
|
||||
id);
|
||||
case GL_VERTEX_PROGRAM_ARB: {
|
||||
struct st_vertex_program *prog = CALLOC_STRUCT(st_vertex_program);
|
||||
|
||||
prog->id = st->program_id++;
|
||||
prog->dirty = 1;
|
||||
|
||||
return _mesa_init_vertex_program( ctx,
|
||||
&prog->Base,
|
||||
target,
|
||||
id );
|
||||
}
|
||||
|
||||
case GL_FRAGMENT_PROGRAM_ARB: {
|
||||
struct st_fragment_program *prog = CALLOC_STRUCT(st_fragment_program);
|
||||
|
||||
prog->id = st->program_id++;
|
||||
prog->dirty = 1;
|
||||
|
||||
return _mesa_init_fragment_program( ctx,
|
||||
&prog->Base,
|
||||
|
|
@ -106,40 +114,25 @@ static void st_program_string_notify( GLcontext *ctx,
|
|||
GLenum target,
|
||||
struct gl_program *prog )
|
||||
{
|
||||
struct st_context *st = st_context(ctx);
|
||||
|
||||
if (target == GL_FRAGMENT_PROGRAM_ARB) {
|
||||
struct st_context *st = st_context(ctx);
|
||||
|
||||
if (prog == &st->ctx->FragmentProgram._Current->Base)
|
||||
{
|
||||
struct st_fragment_program *p =
|
||||
(struct st_fragment_program *) prog;
|
||||
struct st_fragment_program *p = (struct st_fragment_program *)prog;
|
||||
|
||||
if (prog == &ctx->FragmentProgram._Current->Base)
|
||||
st->dirty.st |= ST_NEW_FRAGMENT_PROGRAM;
|
||||
|
||||
p->id = st->program_id++;
|
||||
#if 0
|
||||
p->param_state = p->Base.Base.Parameters->StateFlags;
|
||||
p->translated = 0;
|
||||
#endif
|
||||
|
||||
/* Gack! do this in the compiler:
|
||||
*/
|
||||
if (p->Base.FogOption) {
|
||||
/* add extra instructions to do fog, then turn off FogOption field */
|
||||
_mesa_append_fog_code(ctx, &p->Base);
|
||||
p->Base.FogOption = GL_NONE;
|
||||
}
|
||||
|
||||
/* XXX: Not hooked-up yet. */
|
||||
{
|
||||
struct tgsi_token tokens[1024];
|
||||
|
||||
tgsi_mesa_compile_fp_program( prog, tokens, 1024 );
|
||||
tgsi_dump( tokens, TGSI_DUMP_VERBOSE );
|
||||
}
|
||||
}
|
||||
p->id = st->program_id++;
|
||||
p->param_state = p->Base.Base.Parameters->StateFlags;
|
||||
}
|
||||
else if (target == GL_VERTEX_PROGRAM_ARB) {
|
||||
struct st_vertex_program *p = (struct st_vertex_program *)prog;
|
||||
|
||||
if (prog == &ctx->VertexProgram._Current->Base)
|
||||
st->dirty.st |= ST_NEW_VERTEX_PROGRAM;
|
||||
|
||||
p->id = st->program_id++;
|
||||
p->param_state = p->Base.Base.Parameters->StateFlags;
|
||||
|
||||
/* Also tell tnl about it:
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -40,6 +40,7 @@ struct st_fragment_program;
|
|||
|
||||
#define ST_NEW_MESA 0x1 /* Mesa state has changed */
|
||||
#define ST_NEW_FRAGMENT_PROGRAM 0x2
|
||||
#define ST_NEW_VERTEX_PROGRAM 0x4
|
||||
|
||||
struct st_state_flags {
|
||||
GLuint mesa;
|
||||
|
|
|
|||
|
|
@ -34,6 +34,12 @@
|
|||
#ifndef ST_PROGRAM_H
|
||||
#define ST_PROGRAM_H
|
||||
|
||||
#include "mtypes.h"
|
||||
#include "pipe/tgsi/core/tgsi_token.h"
|
||||
|
||||
#define ST_FP_MAX_TOKENS 1024
|
||||
|
||||
|
||||
struct st_fragment_program
|
||||
{
|
||||
struct gl_fragment_program Base;
|
||||
|
|
@ -43,6 +49,11 @@ struct st_fragment_program
|
|||
* ProgramStringNotify changes.
|
||||
*/
|
||||
|
||||
|
||||
struct tgsi_token tokens[ST_FP_MAX_TOKENS];
|
||||
GLboolean dirty;
|
||||
|
||||
|
||||
#if 0
|
||||
GLfloat (*cbuffer)[4];
|
||||
GLuint nr_constants;
|
||||
|
|
@ -56,13 +67,38 @@ struct st_fragment_program
|
|||
const GLfloat *values; /* Pointer to tracked values */
|
||||
} *param;
|
||||
GLuint nr_params;
|
||||
#endif
|
||||
|
||||
GLuint param_state;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
struct st_vertex_program
|
||||
{
|
||||
struct gl_vertex_program Base;
|
||||
GLboolean error; /* If program is malformed for any reason. */
|
||||
|
||||
GLuint id; /* String id, for tracking
|
||||
* ProgramStringNotify changes.
|
||||
*/
|
||||
|
||||
GLboolean dirty;
|
||||
GLuint param_state;
|
||||
};
|
||||
|
||||
void st_init_cb_program( struct st_context *st );
|
||||
void st_destroy_cb_program( struct st_context *st );
|
||||
|
||||
static inline struct st_fragment_program *
|
||||
st_fragment_program( struct gl_fragment_program *fp )
|
||||
{
|
||||
return (struct st_fragment_program *)fp;
|
||||
}
|
||||
|
||||
static inline struct st_vertex_program *
|
||||
st_vertex_program( struct gl_vertex_program *vp )
|
||||
{
|
||||
return (struct st_vertex_program *)vp;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -484,7 +484,7 @@ draw_depth_pixels( GLcontext *ctx, GLint x, GLint y,
|
|||
}
|
||||
else {
|
||||
/* General case */
|
||||
const GLfloat depthMax = ctx->DrawBuffer->_DepthMaxF;
|
||||
const GLuint depthMax = ctx->DrawBuffer->_DepthMax;
|
||||
GLint skipPixels = 0;
|
||||
|
||||
/* in case width > MAX_WIDTH do the copy in chunks */
|
||||
|
|
@ -695,7 +695,7 @@ draw_depth_stencil_pixels(GLcontext *ctx, GLint x, GLint y,
|
|||
const GLint imgX = x, imgY = y;
|
||||
const GLboolean scaleOrBias
|
||||
= ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0;
|
||||
const GLfloat depthScale = ctx->DrawBuffer->_DepthMaxF;
|
||||
const GLuint depthMax = ctx->DrawBuffer->_DepthMax;
|
||||
const GLuint stencilMask = ctx->Stencil.WriteMask[0];
|
||||
const GLuint stencilType = (STENCIL_BITS == 8) ?
|
||||
GL_UNSIGNED_BYTE : GL_UNSIGNED_SHORT;
|
||||
|
|
@ -783,7 +783,7 @@ draw_depth_stencil_pixels(GLcontext *ctx, GLint x, GLint y,
|
|||
/* general case */
|
||||
GLuint zValues[MAX_WIDTH]; /* 16 or 32-bit Z value storage */
|
||||
_mesa_unpack_depth_span(ctx, width,
|
||||
depthRb->DataType, zValues, depthScale,
|
||||
depthRb->DataType, zValues, depthMax,
|
||||
type, depthStencilSrc, &clippedUnpack);
|
||||
if (zoom) {
|
||||
_swrast_write_zoomed_z_span(ctx, imgX, imgY, width, x,
|
||||
|
|
|
|||
|
|
@ -1,8 +1,8 @@
|
|||
/*
|
||||
* Mesa 3-D graphics library
|
||||
* Version: 6.5
|
||||
* Version: 7.1
|
||||
*
|
||||
* Copyright (C) 1999-2005 Brian Paul All Rights Reserved.
|
||||
* Copyright (C) 1999-2007 Brian Paul All Rights Reserved.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
|
|
@ -392,6 +392,23 @@ do_stencil_test( GLcontext *ctx, GLuint face, GLuint n, GLstencil stencil[],
|
|||
}
|
||||
|
||||
|
||||
/**
|
||||
* Compute the zpass/zfail masks by comparing the pre- and post-depth test
|
||||
* masks.
|
||||
*/
|
||||
static INLINE void
|
||||
compute_pass_fail_masks(GLuint n, const GLubyte origMask[],
|
||||
const GLubyte newMask[],
|
||||
GLubyte passMask[], GLubyte failMask[])
|
||||
{
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
ASSERT(newMask[i] == 0 || newMask[i] == 1);
|
||||
passMask[i] = origMask[i] & newMask[i];
|
||||
failMask[i] = origMask[i] & (newMask[i] ^ 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Apply stencil and depth testing to the span of pixels.
|
||||
|
|
@ -460,39 +477,24 @@ stencil_and_ztest_span(GLcontext *ctx, SWspan *span, GLuint face)
|
|||
/*
|
||||
* Perform depth buffering, then apply zpass or zfail stencil function.
|
||||
*/
|
||||
GLubyte passmask[MAX_WIDTH], failmask[MAX_WIDTH], oldmask[MAX_WIDTH];
|
||||
GLuint i;
|
||||
GLubyte passMask[MAX_WIDTH], failMask[MAX_WIDTH], origMask[MAX_WIDTH];
|
||||
|
||||
/* save the current mask bits */
|
||||
_mesa_memcpy(oldmask, mask, n * sizeof(GLubyte));
|
||||
_mesa_memcpy(origMask, mask, n * sizeof(GLubyte));
|
||||
|
||||
/* apply the depth test */
|
||||
_swrast_depth_test_span(ctx, span);
|
||||
|
||||
/* Set the stencil pass/fail flags according to result of depth testing.
|
||||
* if oldmask[i] == 0 then
|
||||
* Don't touch the stencil value
|
||||
* else if oldmask[i] and newmask[i] then
|
||||
* Depth test passed
|
||||
* else
|
||||
* assert(oldmask[i] && !newmask[i])
|
||||
* Depth test failed
|
||||
* endif
|
||||
*/
|
||||
for (i=0;i<n;i++) {
|
||||
ASSERT(mask[i] == 0 || mask[i] == 1);
|
||||
passmask[i] = oldmask[i] & mask[i];
|
||||
failmask[i] = oldmask[i] & (mask[i] ^ 1);
|
||||
}
|
||||
compute_pass_fail_masks(n, origMask, mask, passMask, failMask);
|
||||
|
||||
/* apply the pass and fail operations */
|
||||
if (ctx->Stencil.ZFailFunc[face] != GL_KEEP) {
|
||||
apply_stencil_op( ctx, ctx->Stencil.ZFailFunc[face], face,
|
||||
n, stencil, failmask );
|
||||
n, stencil, failMask );
|
||||
}
|
||||
if (ctx->Stencil.ZPassFunc[face] != GL_KEEP) {
|
||||
apply_stencil_op( ctx, ctx->Stencil.ZPassFunc[face], face,
|
||||
n, stencil, passmask );
|
||||
n, stencil, passMask );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -902,6 +904,7 @@ stencil_test_pixels( GLcontext *ctx, GLuint face, GLuint n,
|
|||
static GLboolean
|
||||
stencil_and_ztest_pixels( GLcontext *ctx, SWspan *span, GLuint face )
|
||||
{
|
||||
GLubyte passMask[MAX_WIDTH], failMask[MAX_WIDTH], origMask[MAX_WIDTH];
|
||||
struct gl_framebuffer *fb = ctx->DrawBuffer;
|
||||
struct gl_renderbuffer *rb = fb->_StencilBuffer;
|
||||
const GLuint n = span->end;
|
||||
|
|
@ -916,13 +919,10 @@ stencil_and_ztest_pixels( GLcontext *ctx, SWspan *span, GLuint face )
|
|||
if (!rb->GetPointer(ctx, rb, 0, 0)) {
|
||||
/* No direct access */
|
||||
GLstencil stencil[MAX_WIDTH];
|
||||
GLubyte origMask[MAX_WIDTH];
|
||||
|
||||
ASSERT(rb->DataType == GL_UNSIGNED_BYTE);
|
||||
_swrast_get_values(ctx, rb, n, x, y, stencil, sizeof(GLubyte));
|
||||
|
||||
_mesa_memcpy(origMask, mask, n * sizeof(GLubyte));
|
||||
|
||||
(void) do_stencil_test(ctx, face, n, stencil, mask);
|
||||
|
||||
if (ctx->Depth.Test == GL_FALSE) {
|
||||
|
|
@ -930,27 +930,19 @@ stencil_and_ztest_pixels( GLcontext *ctx, SWspan *span, GLuint face )
|
|||
n, stencil, mask);
|
||||
}
|
||||
else {
|
||||
_mesa_memcpy(origMask, mask, n * sizeof(GLubyte));
|
||||
|
||||
_swrast_depth_test_span(ctx, span);
|
||||
|
||||
compute_pass_fail_masks(n, origMask, mask, passMask, failMask);
|
||||
|
||||
if (ctx->Stencil.ZFailFunc[face] != GL_KEEP) {
|
||||
GLubyte failmask[MAX_WIDTH];
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
ASSERT(mask[i] == 0 || mask[i] == 1);
|
||||
failmask[i] = origMask[i] & (mask[i] ^ 1);
|
||||
}
|
||||
apply_stencil_op(ctx, ctx->Stencil.ZFailFunc[face], face,
|
||||
n, stencil, failmask);
|
||||
n, stencil, failMask);
|
||||
}
|
||||
if (ctx->Stencil.ZPassFunc[face] != GL_KEEP) {
|
||||
GLubyte passmask[MAX_WIDTH];
|
||||
GLuint i;
|
||||
for (i = 0; i < n; i++) {
|
||||
ASSERT(mask[i] == 0 || mask[i] == 1);
|
||||
passmask[i] = origMask[i] & mask[i];
|
||||
}
|
||||
apply_stencil_op(ctx, ctx->Stencil.ZPassFunc[face], face,
|
||||
n, stencil, passmask);
|
||||
n, stencil, passMask);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -972,28 +964,21 @@ stencil_and_ztest_pixels( GLcontext *ctx, SWspan *span, GLuint face )
|
|||
ctx->Stencil.ZPassFunc[face], face, mask);
|
||||
}
|
||||
else {
|
||||
GLubyte passmask[MAX_WIDTH], failmask[MAX_WIDTH], oldmask[MAX_WIDTH];
|
||||
GLuint i;
|
||||
|
||||
_mesa_memcpy(oldmask, mask, n * sizeof(GLubyte));
|
||||
_mesa_memcpy(origMask, mask, n * sizeof(GLubyte));
|
||||
|
||||
_swrast_depth_test_span(ctx, span);
|
||||
|
||||
for (i=0;i<n;i++) {
|
||||
ASSERT(mask[i] == 0 || mask[i] == 1);
|
||||
passmask[i] = oldmask[i] & mask[i];
|
||||
failmask[i] = oldmask[i] & (mask[i] ^ 1);
|
||||
}
|
||||
compute_pass_fail_masks(n, origMask, mask, passMask, failMask);
|
||||
|
||||
if (ctx->Stencil.ZFailFunc[face] != GL_KEEP) {
|
||||
apply_stencil_op_to_pixels(ctx, n, x, y,
|
||||
ctx->Stencil.ZFailFunc[face],
|
||||
face, failmask);
|
||||
face, failMask);
|
||||
}
|
||||
if (ctx->Stencil.ZPassFunc[face] != GL_KEEP) {
|
||||
apply_stencil_op_to_pixels(ctx, n, x, y,
|
||||
ctx->Stencil.ZPassFunc[face],
|
||||
face, passmask);
|
||||
face, passMask);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -280,26 +280,29 @@ _swsetup_Translate( GLcontext *ctx, const void *vertex, SWvertex *dest )
|
|||
|
||||
/** XXX try to limit these loops someday */
|
||||
for (i = 0 ; i < ctx->Const.MaxTextureCoordUnits ; i++)
|
||||
_tnl_get_attr( ctx, vertex, _TNL_ATTRIB_TEX0+i,
|
||||
_tnl_get_attr( ctx, vertex, _TNL_ATTRIB_TEX0 + i,
|
||||
dest->attrib[FRAG_ATTRIB_TEX0 + i] );
|
||||
|
||||
for (i = 0 ; i < ctx->Const.MaxVarying ; i++)
|
||||
_tnl_get_attr( ctx, vertex, _TNL_ATTRIB_GENERIC0+i,
|
||||
_tnl_get_attr( ctx, vertex, _TNL_ATTRIB_GENERIC0 + i,
|
||||
dest->attrib[FRAG_ATTRIB_VAR0 + i] );
|
||||
|
||||
_tnl_get_attr( ctx, vertex, _TNL_ATTRIB_COLOR0, tmp );
|
||||
/* XXX need float color FRAG_ATTRIB_COL0?? */
|
||||
UNCLAMPED_FLOAT_TO_RGBA_CHAN( dest->color, tmp );
|
||||
if (ctx->Visual.rgbMode) {
|
||||
_tnl_get_attr( ctx, vertex, _TNL_ATTRIB_COLOR0,
|
||||
dest->attrib[FRAG_ATTRIB_COL0] );
|
||||
UNCLAMPED_FLOAT_TO_RGBA_CHAN( dest->color, tmp );
|
||||
|
||||
_tnl_get_attr( ctx, vertex, _TNL_ATTRIB_COLOR1, tmp );
|
||||
COPY_4V(dest->attrib[FRAG_ATTRIB_COL1], tmp);
|
||||
_tnl_get_attr( ctx, vertex, _TNL_ATTRIB_COLOR1,
|
||||
dest->attrib[FRAG_ATTRIB_COL1]);
|
||||
}
|
||||
else {
|
||||
_tnl_get_attr( ctx, vertex, _TNL_ATTRIB_COLOR_INDEX, tmp );
|
||||
dest->attrib[FRAG_ATTRIB_CI][0] = tmp[0];
|
||||
}
|
||||
|
||||
_tnl_get_attr( ctx, vertex, _TNL_ATTRIB_FOG, tmp );
|
||||
dest->attrib[FRAG_ATTRIB_FOGC][0] = tmp[0];
|
||||
|
||||
_tnl_get_attr( ctx, vertex, _TNL_ATTRIB_COLOR_INDEX, tmp );
|
||||
dest->attrib[FRAG_ATTRIB_CI][0] = tmp[0];
|
||||
|
||||
/* XXX See _tnl_get_attr about pointsize ... */
|
||||
_tnl_get_attr( ctx, vertex, _TNL_ATTRIB_POINTSIZE, tmp );
|
||||
dest->pointSize = tmp[0];
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@ static void TAG(triangle)(GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 )
|
|||
SWvertex *verts = SWSETUP_CONTEXT(ctx)->verts;
|
||||
SWvertex *v[3];
|
||||
GLfloat z[3];
|
||||
GLfloat offset;
|
||||
GLfloat offset, oz0, oz1, oz2;
|
||||
GLenum mode = GL_FILL;
|
||||
GLuint facing = 0;
|
||||
GLchan saved_color[3][4];
|
||||
|
|
@ -142,12 +142,16 @@ static void TAG(triangle)(GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 )
|
|||
}
|
||||
}
|
||||
|
||||
if (IND & SS_OFFSET_BIT)
|
||||
{
|
||||
offset = ctx->Polygon.OffsetUnits * ctx->DrawBuffer->_MRD;
|
||||
if (IND & SS_OFFSET_BIT) {
|
||||
const GLfloat max = ctx->DrawBuffer->_DepthMaxF;
|
||||
/* save original Z values (restored later) */
|
||||
z[0] = v[0]->attrib[FRAG_ATTRIB_WPOS][2];
|
||||
z[1] = v[1]->attrib[FRAG_ATTRIB_WPOS][2];
|
||||
z[2] = v[2]->attrib[FRAG_ATTRIB_WPOS][2];
|
||||
/* Note that Z values are already scaled to [0,65535] (for example)
|
||||
* so no MRD value is used here.
|
||||
*/
|
||||
offset = ctx->Polygon.OffsetUnits;
|
||||
if (cc * cc > 1e-16) {
|
||||
const GLfloat ez = z[0] - z[2];
|
||||
const GLfloat fz = z[1] - z[2];
|
||||
|
|
@ -155,35 +159,33 @@ static void TAG(triangle)(GLcontext *ctx, GLuint e0, GLuint e1, GLuint e2 )
|
|||
const GLfloat dzdx = FABSF((ey * fz - ez * fy) * oneOverArea);
|
||||
const GLfloat dzdy = FABSF((ez * fx - ex * fz) * oneOverArea);
|
||||
offset += MAX2(dzdx, dzdy) * ctx->Polygon.OffsetFactor;
|
||||
/* Unfortunately, we need to clamp to prevent negative Zs below.
|
||||
* Technically, we should do the clamping per-fragment.
|
||||
*/
|
||||
offset = MAX2(offset, -v[0]->attrib[FRAG_ATTRIB_WPOS][2]);
|
||||
offset = MAX2(offset, -v[1]->attrib[FRAG_ATTRIB_WPOS][2]);
|
||||
offset = MAX2(offset, -v[2]->attrib[FRAG_ATTRIB_WPOS][2]);
|
||||
}
|
||||
/* new Z values */
|
||||
oz0 = CLAMP(v[0]->attrib[FRAG_ATTRIB_WPOS][2] + offset, 0.0, max);
|
||||
oz1 = CLAMP(v[1]->attrib[FRAG_ATTRIB_WPOS][2] + offset, 0.0, max);
|
||||
oz2 = CLAMP(v[2]->attrib[FRAG_ATTRIB_WPOS][2] + offset, 0.0, max);
|
||||
}
|
||||
}
|
||||
|
||||
if (mode == GL_POINT) {
|
||||
if ((IND & SS_OFFSET_BIT) && ctx->Polygon.OffsetPoint) {
|
||||
v[0]->attrib[FRAG_ATTRIB_WPOS][2] += offset;
|
||||
v[1]->attrib[FRAG_ATTRIB_WPOS][2] += offset;
|
||||
v[2]->attrib[FRAG_ATTRIB_WPOS][2] += offset;
|
||||
v[0]->attrib[FRAG_ATTRIB_WPOS][2] = oz0;
|
||||
v[1]->attrib[FRAG_ATTRIB_WPOS][2] = oz1;
|
||||
v[2]->attrib[FRAG_ATTRIB_WPOS][2] = oz2;
|
||||
}
|
||||
_swsetup_render_point_tri( ctx, e0, e1, e2, facing );
|
||||
} else if (mode == GL_LINE) {
|
||||
if ((IND & SS_OFFSET_BIT) && ctx->Polygon.OffsetLine) {
|
||||
v[0]->attrib[FRAG_ATTRIB_WPOS][2] += offset;
|
||||
v[1]->attrib[FRAG_ATTRIB_WPOS][2] += offset;
|
||||
v[2]->attrib[FRAG_ATTRIB_WPOS][2] += offset;
|
||||
v[0]->attrib[FRAG_ATTRIB_WPOS][2] = oz0;
|
||||
v[1]->attrib[FRAG_ATTRIB_WPOS][2] = oz1;
|
||||
v[2]->attrib[FRAG_ATTRIB_WPOS][2] = oz2;
|
||||
}
|
||||
_swsetup_render_line_tri( ctx, e0, e1, e2, facing );
|
||||
} else {
|
||||
if ((IND & SS_OFFSET_BIT) && ctx->Polygon.OffsetFill) {
|
||||
v[0]->attrib[FRAG_ATTRIB_WPOS][2] += offset;
|
||||
v[1]->attrib[FRAG_ATTRIB_WPOS][2] += offset;
|
||||
v[2]->attrib[FRAG_ATTRIB_WPOS][2] += offset;
|
||||
v[0]->attrib[FRAG_ATTRIB_WPOS][2] = oz0;
|
||||
v[1]->attrib[FRAG_ATTRIB_WPOS][2] = oz1;
|
||||
v[2]->attrib[FRAG_ATTRIB_WPOS][2] = oz2;
|
||||
}
|
||||
_swrast_Triangle( ctx, v[0], v[1], v[2] );
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue