Fix problem with initial viewport/scissor size.

If an app never called glViewport, the viewport size was always 0 by 0 pixels.
Now pass initial size to st_create_framebuffer() and initialize the viewport
and scissor bounds in st_make_current().
This could also be fixed by ensuring the gl_framebuffers passed to
_mesa_make_current() were initialized to the right size.  But that involves
allocating the renderbuffers/pipe_surfaces earlier and that runs into some
other issues ATM.
Also remove obsolete createRenderbuffers param to st_create_framebuffer().
This commit is contained in:
Brian
2007-12-19 13:45:00 -07:00
parent 1575763a6f
commit c664302c3e
6 changed files with 79 additions and 59 deletions

View File

@@ -297,10 +297,12 @@ intelCreateBuffer(__DRIscreenPrivate * driScrnPriv,
else else
stencilFormat = PIPE_FORMAT_NONE; stencilFormat = PIPE_FORMAT_NONE;
intelfb->stfb = st_create_framebuffer(visual, GL_TRUE, intelfb->stfb = st_create_framebuffer(visual,
colorFormat, colorFormat,
depthFormat, depthFormat,
stencilFormat, stencilFormat,
driDrawPriv->w,
driDrawPriv->h,
(void*) intelfb); (void*) intelfb);
if (!intelfb->stfb) { if (!intelfb->stfb) {
free(intelfb); free(intelfb);

View File

@@ -207,7 +207,7 @@ static GLboolean window_exists( XMesaDisplay *dpy, Window win )
} }
static Status static Status
get_drawable_size( XMesaDisplay *dpy, Drawable d, GLuint *width, GLuint *height ) get_drawable_size( XMesaDisplay *dpy, Drawable d, uint *width, uint *height )
{ {
Window root; Window root;
Status stat; Status stat;
@@ -323,6 +323,7 @@ create_xmesa_buffer(XMesaDrawable d, BufferType type,
XMesaBuffer b; XMesaBuffer b;
GLframebuffer *fb; GLframebuffer *fb;
enum pipe_format colorFormat, depthFormat, stencilFormat; enum pipe_format colorFormat, depthFormat, stencilFormat;
uint width, height;
ASSERT(type == WINDOW || type == PIXMAP || type == PBUFFER); ASSERT(type == WINDOW || type == PIXMAP || type == PBUFFER);
@@ -359,11 +360,14 @@ create_xmesa_buffer(XMesaDrawable d, BufferType type,
} }
get_drawable_size(vis->display, d, &width, &height);
/* /*
* Create framebuffer, but we'll plug in our own renderbuffers below. * Create framebuffer, but we'll plug in our own renderbuffers below.
*/ */
b->stfb = st_create_framebuffer(&vis->mesa_visual, GL_TRUE, b->stfb = st_create_framebuffer(&vis->mesa_visual,
colorFormat, depthFormat, stencilFormat, colorFormat, depthFormat, stencilFormat,
width, height,
(void *) b); (void *) b);
fb = &b->stfb->Base; fb = &b->stfb->Base;

View File

@@ -28,6 +28,8 @@
#include "main/imports.h" #include "main/imports.h"
#include "main/context.h" #include "main/context.h"
#include "main/extensions.h" #include "main/extensions.h"
#include "main/matrix.h"
#include "main/buffers.h"
#include "vbo/vbo.h" #include "vbo/vbo.h"
#include "shader/shader_api.h" #include "shader/shader_api.h"
#include "st_public.h" #include "st_public.h"
@@ -163,7 +165,19 @@ void st_make_current(struct st_context *st,
struct st_framebuffer *read) struct st_framebuffer *read)
{ {
if (st) { if (st) {
GLboolean firstTime = st->ctx->FirstTimeCurrent;
_mesa_make_current(st->ctx, &draw->Base, &read->Base); _mesa_make_current(st->ctx, &draw->Base, &read->Base);
/* Need to initialize viewport here since draw->Base->Width/Height
* will still be zero at this point.
* This could be improved, but would require rather extensive work
* elsewhere (allocate rb surface storage sooner)
*/
if (firstTime) {
GLuint w = draw->InitWidth, h = draw->InitHeight;
_mesa_set_viewport(st->ctx, 0, 0, w, h);
_mesa_set_scissor(st->ctx, 0, 0, w, h);
}
} }
else { else {
_mesa_make_current(NULL, NULL, NULL); _mesa_make_current(NULL, NULL, NULL);

View File

@@ -191,6 +191,7 @@ struct st_framebuffer
{ {
GLframebuffer Base; GLframebuffer Base;
void *Private; void *Private;
GLuint InitWidth, InitHeight;
}; };

View File

@@ -37,80 +37,79 @@
struct st_framebuffer * struct st_framebuffer *
st_create_framebuffer( const __GLcontextModes *visual, st_create_framebuffer( const __GLcontextModes *visual,
boolean createRenderbuffers, /* XXX remove? */
enum pipe_format colorFormat, enum pipe_format colorFormat,
enum pipe_format depthFormat, enum pipe_format depthFormat,
enum pipe_format stencilFormat, enum pipe_format stencilFormat,
uint width, uint height,
void *private) void *private)
{ {
struct st_framebuffer *stfb = CALLOC_STRUCT(st_framebuffer); struct st_framebuffer *stfb = CALLOC_STRUCT(st_framebuffer);
if (stfb) { if (stfb) {
_mesa_initialize_framebuffer(&stfb->Base, visual); _mesa_initialize_framebuffer(&stfb->Base, visual);
if (createRenderbuffers) { {
{ /* fake frontbuffer */
/* fake frontbuffer */ /* XXX allocation should only happen in the unusual case
/* XXX allocation should only happen in the unusual case it's actually needed */
it's actually needed */ struct gl_renderbuffer *rb
struct gl_renderbuffer *rb = st_new_renderbuffer_fb(colorFormat);
= st_new_renderbuffer_fb(colorFormat); _mesa_add_renderbuffer(&stfb->Base, BUFFER_FRONT_LEFT, rb);
_mesa_add_renderbuffer(&stfb->Base, BUFFER_FRONT_LEFT, rb); }
}
if (visual->doubleBufferMode) { if (visual->doubleBufferMode) {
struct gl_renderbuffer *rb struct gl_renderbuffer *rb
= st_new_renderbuffer_fb(colorFormat); = st_new_renderbuffer_fb(colorFormat);
_mesa_add_renderbuffer(&stfb->Base, BUFFER_BACK_LEFT, rb); _mesa_add_renderbuffer(&stfb->Base, BUFFER_BACK_LEFT, rb);
} }
if (visual->depthBits == 24 && visual->stencilBits == 8) { if (visual->depthBits == 24 && visual->stencilBits == 8) {
/* combined depth/stencil buffer */ /* combined depth/stencil buffer */
struct gl_renderbuffer *depthStencilRb struct gl_renderbuffer *depthStencilRb
= st_new_renderbuffer_fb(depthFormat);
/* note: bind RB to two attachment points */
_mesa_add_renderbuffer(&stfb->Base, BUFFER_DEPTH, depthStencilRb);
_mesa_add_renderbuffer(&stfb->Base, BUFFER_STENCIL, depthStencilRb);
}
else {
/* separate depth and/or stencil */
if (visual->depthBits == 32) {
/* 32-bit depth buffer */
struct gl_renderbuffer *depthRb
= st_new_renderbuffer_fb(depthFormat); = st_new_renderbuffer_fb(depthFormat);
/* note: bind RB to two attachment points */ _mesa_add_renderbuffer(&stfb->Base, BUFFER_DEPTH, depthRb);
_mesa_add_renderbuffer(&stfb->Base, BUFFER_DEPTH, depthStencilRb);
_mesa_add_renderbuffer(&stfb->Base, BUFFER_STENCIL, depthStencilRb);
} }
else { else if (visual->depthBits == 24) {
/* separate depth and/or stencil */ /* 24-bit depth buffer, ignore stencil bits */
struct gl_renderbuffer *depthRb
if (visual->depthBits == 32) { = st_new_renderbuffer_fb(depthFormat);
/* 32-bit depth buffer */ _mesa_add_renderbuffer(&stfb->Base, BUFFER_DEPTH, depthRb);
struct gl_renderbuffer *depthRb }
= st_new_renderbuffer_fb(depthFormat); else if (visual->depthBits > 0) {
_mesa_add_renderbuffer(&stfb->Base, BUFFER_DEPTH, depthRb); /* 16-bit depth buffer */
} struct gl_renderbuffer *depthRb
else if (visual->depthBits == 24) { = st_new_renderbuffer_fb(depthFormat);
/* 24-bit depth buffer, ignore stencil bits */ _mesa_add_renderbuffer(&stfb->Base, BUFFER_DEPTH, depthRb);
struct gl_renderbuffer *depthRb
= st_new_renderbuffer_fb(depthFormat);
_mesa_add_renderbuffer(&stfb->Base, BUFFER_DEPTH, depthRb);
}
else if (visual->depthBits > 0) {
/* 16-bit depth buffer */
struct gl_renderbuffer *depthRb
= st_new_renderbuffer_fb(depthFormat);
_mesa_add_renderbuffer(&stfb->Base, BUFFER_DEPTH, depthRb);
}
if (visual->stencilBits > 0) {
/* 8-bit stencil */
struct gl_renderbuffer *stencilRb
= st_new_renderbuffer_fb(stencilFormat);
_mesa_add_renderbuffer(&stfb->Base, BUFFER_STENCIL, stencilRb);
}
} }
if (visual->accumRedBits > 0) { if (visual->stencilBits > 0) {
/* 16-bit/channel accum */ /* 8-bit stencil */
struct gl_renderbuffer *accumRb struct gl_renderbuffer *stencilRb
= st_new_renderbuffer_fb(PIPE_FORMAT_R16G16B16A16_SNORM); = st_new_renderbuffer_fb(stencilFormat);
_mesa_add_renderbuffer(&stfb->Base, BUFFER_ACCUM, accumRb); _mesa_add_renderbuffer(&stfb->Base, BUFFER_STENCIL, stencilRb);
} }
} }
stfb->Base.Initialized = GL_TRUE; if (visual->accumRedBits > 0) {
/* 16-bit/channel accum */
struct gl_renderbuffer *accumRb
= st_new_renderbuffer_fb(PIPE_FORMAT_R16G16B16A16_SNORM);
_mesa_add_renderbuffer(&stfb->Base, BUFFER_ACCUM, accumRb);
}
stfb->Base.Initialized = GL_TRUE;
stfb->InitWidth = width;
stfb->InitHeight = height;
stfb->Private = private; stfb->Private = private;
} }
return stfb; return stfb;

View File

@@ -55,10 +55,10 @@ void st_copy_context_state(struct st_context *dst, struct st_context *src,
uint mask); uint mask);
struct st_framebuffer *st_create_framebuffer( const __GLcontextModes *visual, struct st_framebuffer *st_create_framebuffer( const __GLcontextModes *visual,
boolean createRenderbuffers,
enum pipe_format colorFormat, enum pipe_format colorFormat,
enum pipe_format depthFormat, enum pipe_format depthFormat,
enum pipe_format stencilFormat, enum pipe_format stencilFormat,
uint width, uint height,
void *privateData); void *privateData);
void st_resize_framebuffer( struct st_framebuffer *stfb, void st_resize_framebuffer( struct st_framebuffer *stfb,