intel: Remove struct intel_framebuffer

With the vsync fields no longer relevant and by refactoring the code
to no longer use color_rb[0-1] we can just use struct gl_framebuffer
directly.
This commit is contained in:
Kristian Høgsberg
2010-01-01 23:21:16 -05:00
parent a6e1d3edac
commit d282128ff6
5 changed files with 51 additions and 90 deletions

View File

@@ -191,10 +191,11 @@ intel_bits_per_pixel(const struct intel_renderbuffer *rb)
void void
intel_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable) intel_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable)
{ {
struct intel_framebuffer *intel_fb = drawable->driverPrivate; struct gl_framebuffer *fb = drawable->driverPrivate;
struct intel_renderbuffer *rb; struct intel_renderbuffer *rb;
struct intel_region *region, *depth_region; struct intel_region *region, *depth_region;
struct intel_context *intel = context->driverPrivate; struct intel_context *intel = context->driverPrivate;
struct intel_renderbuffer *front_rb, *back_rb, *depth_rb, *stencil_rb;
__DRIbuffer *buffers = NULL; __DRIbuffer *buffers = NULL;
__DRIscreen *screen; __DRIscreen *screen;
int i, count; int i, count;
@@ -210,26 +211,25 @@ intel_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable)
if (screen->dri2.loader if (screen->dri2.loader
&& (screen->dri2.loader->base.version > 2) && (screen->dri2.loader->base.version > 2)
&& (screen->dri2.loader->getBuffersWithFormat != NULL)) { && (screen->dri2.loader->getBuffersWithFormat != NULL)) {
struct intel_renderbuffer *depth_rb;
struct intel_renderbuffer *stencil_rb; front_rb = intel_get_renderbuffer(fb, BUFFER_FRONT_LEFT);
back_rb = intel_get_renderbuffer(fb, BUFFER_BACK_LEFT);
depth_rb = intel_get_renderbuffer(fb, BUFFER_DEPTH);
stencil_rb = intel_get_renderbuffer(fb, BUFFER_STENCIL);
i = 0; i = 0;
if ((intel->is_front_buffer_rendering || if ((intel->is_front_buffer_rendering ||
intel->is_front_buffer_reading || intel->is_front_buffer_reading ||
!intel_fb->color_rb[1]) !back_rb) && front_rb) {
&& intel_fb->color_rb[0]) {
attachments[i++] = __DRI_BUFFER_FRONT_LEFT; attachments[i++] = __DRI_BUFFER_FRONT_LEFT;
attachments[i++] = intel_bits_per_pixel(intel_fb->color_rb[0]); attachments[i++] = intel_bits_per_pixel(front_rb);
} }
if (intel_fb->color_rb[1]) { if (back_rb) {
attachments[i++] = __DRI_BUFFER_BACK_LEFT; attachments[i++] = __DRI_BUFFER_BACK_LEFT;
attachments[i++] = intel_bits_per_pixel(intel_fb->color_rb[1]); attachments[i++] = intel_bits_per_pixel(back_rb);
} }
depth_rb = intel_get_renderbuffer(&intel_fb->Base, BUFFER_DEPTH);
stencil_rb = intel_get_renderbuffer(&intel_fb->Base, BUFFER_STENCIL);
if ((depth_rb != NULL) && (stencil_rb != NULL)) { if ((depth_rb != NULL) && (stencil_rb != NULL)) {
attachments[i++] = __DRI_BUFFER_DEPTH_STENCIL; attachments[i++] = __DRI_BUFFER_DEPTH_STENCIL;
attachments[i++] = intel_bits_per_pixel(depth_rb); attachments[i++] = intel_bits_per_pixel(depth_rb);
@@ -250,13 +250,13 @@ intel_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable)
drawable->loaderPrivate); drawable->loaderPrivate);
} else if (screen->dri2.loader) { } else if (screen->dri2.loader) {
i = 0; i = 0;
if (intel_fb->color_rb[0]) if (intel_get_renderbuffer(fb, BUFFER_FRONT_LEFT))
attachments[i++] = __DRI_BUFFER_FRONT_LEFT; attachments[i++] = __DRI_BUFFER_FRONT_LEFT;
if (intel_fb->color_rb[1]) if (intel_get_renderbuffer(fb, BUFFER_BACK_LEFT))
attachments[i++] = __DRI_BUFFER_BACK_LEFT; attachments[i++] = __DRI_BUFFER_BACK_LEFT;
if (intel_get_renderbuffer(&intel_fb->Base, BUFFER_DEPTH)) if (intel_get_renderbuffer(fb, BUFFER_DEPTH))
attachments[i++] = __DRI_BUFFER_DEPTH; attachments[i++] = __DRI_BUFFER_DEPTH;
if (intel_get_renderbuffer(&intel_fb->Base, BUFFER_STENCIL)) if (intel_get_renderbuffer(fb, BUFFER_STENCIL))
attachments[i++] = __DRI_BUFFER_STENCIL; attachments[i++] = __DRI_BUFFER_STENCIL;
buffers = (*screen->dri2.loader->getBuffers)(drawable, buffers = (*screen->dri2.loader->getBuffers)(drawable,
@@ -289,32 +289,32 @@ intel_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable)
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
switch (buffers[i].attachment) { switch (buffers[i].attachment) {
case __DRI_BUFFER_FRONT_LEFT: case __DRI_BUFFER_FRONT_LEFT:
rb = intel_fb->color_rb[0]; rb = intel_get_renderbuffer(fb, BUFFER_FRONT_LEFT);
region_name = "dri2 front buffer"; region_name = "dri2 front buffer";
break; break;
case __DRI_BUFFER_FAKE_FRONT_LEFT: case __DRI_BUFFER_FAKE_FRONT_LEFT:
rb = intel_fb->color_rb[0]; rb = intel_get_renderbuffer(fb, BUFFER_FRONT_LEFT);
region_name = "dri2 fake front buffer"; region_name = "dri2 fake front buffer";
break; break;
case __DRI_BUFFER_BACK_LEFT: case __DRI_BUFFER_BACK_LEFT:
rb = intel_fb->color_rb[1]; rb = intel_get_renderbuffer(fb, BUFFER_BACK_LEFT);
region_name = "dri2 back buffer"; region_name = "dri2 back buffer";
break; break;
case __DRI_BUFFER_DEPTH: case __DRI_BUFFER_DEPTH:
rb = intel_get_renderbuffer(&intel_fb->Base, BUFFER_DEPTH); rb = intel_get_renderbuffer(fb, BUFFER_DEPTH);
region_name = "dri2 depth buffer"; region_name = "dri2 depth buffer";
break; break;
case __DRI_BUFFER_DEPTH_STENCIL: case __DRI_BUFFER_DEPTH_STENCIL:
rb = intel_get_renderbuffer(&intel_fb->Base, BUFFER_DEPTH); rb = intel_get_renderbuffer(fb, BUFFER_DEPTH);
region_name = "dri2 depth / stencil buffer"; region_name = "dri2 depth / stencil buffer";
break; break;
case __DRI_BUFFER_STENCIL: case __DRI_BUFFER_STENCIL:
rb = intel_get_renderbuffer(&intel_fb->Base, BUFFER_STENCIL); rb = intel_get_renderbuffer(fb, BUFFER_STENCIL);
region_name = "dri2 stencil buffer"; region_name = "dri2 stencil buffer";
break; break;
@@ -361,7 +361,7 @@ intel_update_renderbuffers(__DRIcontext *context, __DRIdrawable *drawable)
intel_region_release(&region); intel_region_release(&region);
if (buffers[i].attachment == __DRI_BUFFER_DEPTH_STENCIL) { if (buffers[i].attachment == __DRI_BUFFER_DEPTH_STENCIL) {
rb = intel_get_renderbuffer(&intel_fb->Base, BUFFER_STENCIL); rb = intel_get_renderbuffer(fb, BUFFER_STENCIL);
if (rb != NULL) { if (rb != NULL) {
struct intel_region *stencil_region = NULL; struct intel_region *stencil_region = NULL;
@@ -883,9 +883,8 @@ intelMakeCurrent(__DRIcontext * driContextPriv,
} }
if (driContextPriv) { if (driContextPriv) {
struct intel_framebuffer *intel_fb = struct gl_framebuffer *fb = driDrawPriv->driverPrivate;
(struct intel_framebuffer *) driDrawPriv->driverPrivate; struct gl_framebuffer *readFb = driReadPriv->driverPrivate;
GLframebuffer *readFb = (GLframebuffer *) driReadPriv->driverPrivate;
intel_update_renderbuffers(driContextPriv, driDrawPriv); intel_update_renderbuffers(driContextPriv, driDrawPriv);
if (driDrawPriv != driReadPriv) if (driDrawPriv != driReadPriv)
@@ -898,10 +897,10 @@ intelMakeCurrent(__DRIcontext * driContextPriv,
driUpdateFramebufferSize(&intel->ctx, driReadPriv); driUpdateFramebufferSize(&intel->ctx, driReadPriv);
} }
_mesa_make_current(&intel->ctx, &intel_fb->Base, readFb); _mesa_make_current(&intel->ctx, fb, readFb);
intel->driReadDrawable = driReadPriv; intel->driReadDrawable = driReadPriv;
intel_draw_buffer(&intel->ctx, &intel_fb->Base); intel->driDrawable = driDrawPriv;
intel_draw_buffer(&intel->ctx, fb);
} }
else { else {
_mesa_make_current(NULL, NULL, NULL); _mesa_make_current(NULL, NULL, NULL);

View File

@@ -222,7 +222,6 @@ static void
intel_resize_buffers(GLcontext *ctx, struct gl_framebuffer *fb, intel_resize_buffers(GLcontext *ctx, struct gl_framebuffer *fb,
GLuint width, GLuint height) GLuint width, GLuint height)
{ {
struct intel_framebuffer *intel_fb = (struct intel_framebuffer*)fb;
int i; int i;
_mesa_resize_framebuffer(ctx, fb, width, height); _mesa_resize_framebuffer(ctx, fb, width, height);
@@ -233,9 +232,10 @@ intel_resize_buffers(GLcontext *ctx, struct gl_framebuffer *fb,
return; return;
} }
/* Make sure all window system renderbuffers are up to date */ /* Make sure all window system renderbuffers are up to date */
for (i = 0; i < 2; i++) { for (i = BUFFER_FRONT_LEFT; i <= BUFFER_BACK_RIGHT; i++) {
struct gl_renderbuffer *rb = &intel_fb->color_rb[i]->Base; struct gl_renderbuffer *rb = fb->Attachment[i].Renderbuffer;
/* only resize if size is changing */ /* only resize if size is changing */
if (rb && (rb->Width != width || rb->Height != height)) { if (rb && (rb->Width != width || rb->Height != height)) {

View File

@@ -33,17 +33,6 @@
struct intel_context; struct intel_context;
/**
* Intel framebuffer, derived from gl_framebuffer.
*/
struct intel_framebuffer
{
struct gl_framebuffer Base;
struct intel_renderbuffer *color_rb[2];
};
/** /**
* Intel renderbuffer, derived from gl_renderbuffer. * Intel renderbuffer, derived from gl_renderbuffer.
*/ */
@@ -109,7 +98,7 @@ intel_fbo_init(struct intel_context *intel);
extern void extern void
intel_flip_renderbuffers(struct intel_framebuffer *intel_fb); intel_flip_renderbuffers(struct gl_framebuffer *fb);
static INLINE struct intel_region * static INLINE struct intel_region *

View File

@@ -159,6 +159,8 @@ intelCreateBuffer(__DRIscreen * driScrnPriv,
__DRIdrawable * driDrawPriv, __DRIdrawable * driDrawPriv,
const __GLcontextModes * mesaVis, GLboolean isPixmap) const __GLcontextModes * mesaVis, GLboolean isPixmap)
{ {
struct intel_renderbuffer *rb;
if (isPixmap) { if (isPixmap) {
return GL_FALSE; /* not implemented */ return GL_FALSE; /* not implemented */
} }
@@ -167,12 +169,12 @@ intelCreateBuffer(__DRIscreen * driScrnPriv,
mesaVis->depthBits != 24); mesaVis->depthBits != 24);
gl_format rgbFormat; gl_format rgbFormat;
struct intel_framebuffer *intel_fb = CALLOC_STRUCT(intel_framebuffer); struct gl_framebuffer *fb = CALLOC_STRUCT(gl_framebuffer);
if (!intel_fb) if (!fb)
return GL_FALSE; return GL_FALSE;
_mesa_initialize_framebuffer(&intel_fb->Base, mesaVis); _mesa_initialize_framebuffer(fb, mesaVis);
if (mesaVis->redBits == 5) if (mesaVis->redBits == 5)
rgbFormat = MESA_FORMAT_RGB565; rgbFormat = MESA_FORMAT_RGB565;
@@ -182,16 +184,12 @@ intelCreateBuffer(__DRIscreen * driScrnPriv,
rgbFormat = MESA_FORMAT_ARGB8888; rgbFormat = MESA_FORMAT_ARGB8888;
/* setup the hardware-based renderbuffers */ /* setup the hardware-based renderbuffers */
intel_fb->color_rb[0] = intel_create_renderbuffer(rgbFormat); rb = intel_create_renderbuffer(rgbFormat);
_mesa_add_renderbuffer(&intel_fb->Base, BUFFER_FRONT_LEFT, _mesa_add_renderbuffer(fb, BUFFER_FRONT_LEFT, &rb->Base);
&intel_fb->color_rb[0]->Base);
if (mesaVis->doubleBufferMode) { if (mesaVis->doubleBufferMode) {
intel_fb->color_rb[1] = intel_create_renderbuffer(rgbFormat); rb = intel_create_renderbuffer(rgbFormat);
_mesa_add_renderbuffer(fb, BUFFER_BACK_LEFT, &rb->Base);
_mesa_add_renderbuffer(&intel_fb->Base, BUFFER_BACK_LEFT,
&intel_fb->color_rb[1]->Base);
} }
if (mesaVis->depthBits == 24) { if (mesaVis->depthBits == 24) {
@@ -200,32 +198,29 @@ intelCreateBuffer(__DRIscreen * driScrnPriv,
struct intel_renderbuffer *depthStencilRb struct intel_renderbuffer *depthStencilRb
= intel_create_renderbuffer(MESA_FORMAT_S8_Z24); = intel_create_renderbuffer(MESA_FORMAT_S8_Z24);
/* note: bind RB to two attachment points */ /* note: bind RB to two attachment points */
_mesa_add_renderbuffer(&intel_fb->Base, BUFFER_DEPTH, _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthStencilRb->Base);
&depthStencilRb->Base); _mesa_add_renderbuffer(fb, BUFFER_STENCIL, &depthStencilRb->Base);
_mesa_add_renderbuffer(&intel_fb->Base, BUFFER_STENCIL,
&depthStencilRb->Base);
} else { } else {
struct intel_renderbuffer *depthRb struct intel_renderbuffer *depthRb
= intel_create_renderbuffer(MESA_FORMAT_X8_Z24); = intel_create_renderbuffer(MESA_FORMAT_X8_Z24);
_mesa_add_renderbuffer(&intel_fb->Base, BUFFER_DEPTH, _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);
&depthRb->Base);
} }
} }
else if (mesaVis->depthBits == 16) { else if (mesaVis->depthBits == 16) {
/* just 16-bit depth buffer, no hw stencil */ /* just 16-bit depth buffer, no hw stencil */
struct intel_renderbuffer *depthRb struct intel_renderbuffer *depthRb
= intel_create_renderbuffer(MESA_FORMAT_Z16); = intel_create_renderbuffer(MESA_FORMAT_Z16);
_mesa_add_renderbuffer(&intel_fb->Base, BUFFER_DEPTH, &depthRb->Base); _mesa_add_renderbuffer(fb, BUFFER_DEPTH, &depthRb->Base);
} }
/* now add any/all software-based renderbuffers we may need */ /* now add any/all software-based renderbuffers we may need */
_mesa_add_soft_renderbuffers(&intel_fb->Base, _mesa_add_soft_renderbuffers(fb,
GL_FALSE, /* never sw color */ GL_FALSE, /* never sw color */
GL_FALSE, /* never sw depth */ GL_FALSE, /* never sw depth */
swStencil, mesaVis->accumRedBits > 0, swStencil, mesaVis->accumRedBits > 0,
GL_FALSE, /* never sw alpha */ GL_FALSE, /* never sw alpha */
GL_FALSE /* never sw aux */ ); GL_FALSE /* never sw aux */ );
driDrawPriv->driverPrivate = (void *) intel_fb; driDrawPriv->driverPrivate = fb;
return GL_TRUE; return GL_TRUE;
} }
@@ -234,31 +229,9 @@ intelCreateBuffer(__DRIscreen * driScrnPriv,
static void static void
intelDestroyBuffer(__DRIdrawable * driDrawPriv) intelDestroyBuffer(__DRIdrawable * driDrawPriv)
{ {
struct intel_framebuffer *intel_fb = driDrawPriv->driverPrivate; struct gl_framebuffer *fb = driDrawPriv->driverPrivate;
struct intel_renderbuffer *depth_rb;
struct intel_renderbuffer *stencil_rb;
if (intel_fb) { _mesa_reference_framebuffer(&fb, NULL);
if (intel_fb->color_rb[0]) {
intel_renderbuffer_set_region(intel_fb->color_rb[0], NULL);
}
if (intel_fb->color_rb[1]) {
intel_renderbuffer_set_region(intel_fb->color_rb[1], NULL);
}
depth_rb = intel_get_renderbuffer(&intel_fb->Base, BUFFER_DEPTH);
if (depth_rb) {
intel_renderbuffer_set_region(depth_rb, NULL);
}
stencil_rb = intel_get_renderbuffer(&intel_fb->Base, BUFFER_STENCIL);
if (stencil_rb) {
intel_renderbuffer_set_region(stencil_rb, NULL);
}
}
_mesa_reference_framebuffer((GLframebuffer **)(&(driDrawPriv->driverPrivate)), NULL);
} }
/* There are probably better ways to do this, such as an /* There are probably better ways to do this, such as an

View File

@@ -725,7 +725,7 @@ intelSetTexBuffer2(__DRIcontext *pDRICtx, GLint target,
GLint glx_texture_format, GLint glx_texture_format,
__DRIdrawable *dPriv) __DRIdrawable *dPriv)
{ {
struct intel_framebuffer *intel_fb = dPriv->driverPrivate; struct gl_framebuffer *fb = dPriv->driverPrivate;
struct intel_context *intel = pDRICtx->driverPrivate; struct intel_context *intel = pDRICtx->driverPrivate;
GLcontext *ctx = &intel->ctx; GLcontext *ctx = &intel->ctx;
struct intel_texture_object *intelObj; struct intel_texture_object *intelObj;
@@ -744,7 +744,7 @@ intelSetTexBuffer2(__DRIcontext *pDRICtx, GLint target,
intel_update_renderbuffers(pDRICtx, dPriv); intel_update_renderbuffers(pDRICtx, dPriv);
rb = intel_fb->color_rb[0]; rb = intel_get_renderbuffer(fb, BUFFER_FRONT_LEFT);
/* If the region isn't set, then intel_update_renderbuffers was unable /* If the region isn't set, then intel_update_renderbuffers was unable
* to get the buffers for the drawable. * to get the buffers for the drawable.
*/ */