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:
@@ -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);
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
@@ -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);
|
||||||
|
@@ -191,6 +191,7 @@ struct st_framebuffer
|
|||||||
{
|
{
|
||||||
GLframebuffer Base;
|
GLframebuffer Base;
|
||||||
void *Private;
|
void *Private;
|
||||||
|
GLuint InitWidth, InitHeight;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@@ -37,17 +37,16 @@
|
|||||||
|
|
||||||
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
|
||||||
@@ -107,10 +106,10 @@ st_create_framebuffer( const __GLcontextModes *visual,
|
|||||||
= st_new_renderbuffer_fb(PIPE_FORMAT_R16G16B16A16_SNORM);
|
= st_new_renderbuffer_fb(PIPE_FORMAT_R16G16B16A16_SNORM);
|
||||||
_mesa_add_renderbuffer(&stfb->Base, BUFFER_ACCUM, accumRb);
|
_mesa_add_renderbuffer(&stfb->Base, BUFFER_ACCUM, accumRb);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
stfb->Base.Initialized = GL_TRUE;
|
stfb->Base.Initialized = GL_TRUE;
|
||||||
|
stfb->InitWidth = width;
|
||||||
|
stfb->InitHeight = height;
|
||||||
stfb->Private = private;
|
stfb->Private = private;
|
||||||
}
|
}
|
||||||
return stfb;
|
return stfb;
|
||||||
|
@@ -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,
|
||||||
|
Reference in New Issue
Block a user