diff options
-rw-r--r-- | mesalib/src/mesa/SConscript | 2 | ||||
-rw-r--r-- | mesalib/src/mesa/main/fbobject.c | 14 | ||||
-rw-r--r-- | mesalib/src/mesa/main/framebuffer.c | 95 | ||||
-rw-r--r-- | mesalib/src/mesa/main/mtypes.h | 5 | ||||
-rw-r--r-- | mesalib/src/mesa/sources.mak | 2 | ||||
-rw-r--r-- | mesalib/src/mesa/state_tracker/st_cb_drawpixels.c | 16 | ||||
-rw-r--r-- | mesalib/src/mesa/state_tracker/st_cb_texture.c | 5 | ||||
-rw-r--r-- | mesalib/src/mesa/swrast/s_blit.c | 3 | ||||
-rw-r--r-- | mesalib/src/mesa/swrast/s_clear.c | 3 | ||||
-rw-r--r-- | mesalib/src/mesa/swrast/s_context.c | 23 | ||||
-rw-r--r-- | mesalib/src/mesa/swrast/s_depthstencil.c (renamed from mesalib/src/mesa/main/depthstencil.c) | 108 | ||||
-rw-r--r-- | mesalib/src/mesa/swrast/s_depthstencil.h (renamed from mesalib/src/mesa/main/depthstencil.h) | 23 | ||||
-rw-r--r-- | mesalib/src/mesa/swrast/s_renderbuffer.c | 54 | ||||
-rw-r--r-- | pixman/pixman/pixman-cpu.c | 56 |
14 files changed, 240 insertions, 169 deletions
diff --git a/mesalib/src/mesa/SConscript b/mesalib/src/mesa/SConscript index da4d9b185..bd9e94b82 100644 --- a/mesalib/src/mesa/SConscript +++ b/mesalib/src/mesa/SConscript @@ -58,7 +58,6 @@ main_sources = [ 'main/cpuinfo.c', 'main/debug.c', 'main/depth.c', - 'main/depthstencil.c', 'main/dlist.c', 'main/dlopen.c', 'main/drawpix.c', @@ -162,6 +161,7 @@ swrast_sources = [ 'swrast/s_copypix.c', 'swrast/s_context.c', 'swrast/s_depth.c', + 'swrast/s_depthstencil.c', 'swrast/s_drawpix.c', 'swrast/s_feedback.c', 'swrast/s_fog.c', diff --git a/mesalib/src/mesa/main/fbobject.c b/mesalib/src/mesa/main/fbobject.c index 9111caa1b..611a6d0b0 100644 --- a/mesalib/src/mesa/main/fbobject.c +++ b/mesalib/src/mesa/main/fbobject.c @@ -2669,8 +2669,10 @@ _mesa_BlitFramebufferEXT(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, } if (mask & GL_STENCIL_BUFFER_BIT) { - struct gl_renderbuffer *readRb = readFb->_StencilBuffer; - struct gl_renderbuffer *drawRb = drawFb->_StencilBuffer; + struct gl_renderbuffer *readRb = + readFb->Attachment[BUFFER_STENCIL].Renderbuffer; + struct gl_renderbuffer *drawRb = + drawFb->Attachment[BUFFER_STENCIL].Renderbuffer; /* From the EXT_framebuffer_object spec: * @@ -2679,7 +2681,6 @@ _mesa_BlitFramebufferEXT(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, * ignored." */ if ((readRb == NULL) || (drawRb == NULL)) { - readRb = drawRb = NULL; mask &= ~GL_STENCIL_BUFFER_BIT; } else if (_mesa_get_format_bits(readRb->Format, GL_STENCIL_BITS) != @@ -2691,8 +2692,10 @@ _mesa_BlitFramebufferEXT(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, } if (mask & GL_DEPTH_BUFFER_BIT) { - struct gl_renderbuffer *readRb = readFb->_DepthBuffer; - struct gl_renderbuffer *drawRb = drawFb->_DepthBuffer; + struct gl_renderbuffer *readRb = + readFb->Attachment[BUFFER_DEPTH].Renderbuffer; + struct gl_renderbuffer *drawRb = + drawFb->Attachment[BUFFER_DEPTH].Renderbuffer; /* From the EXT_framebuffer_object spec: * @@ -2701,7 +2704,6 @@ _mesa_BlitFramebufferEXT(GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, * ignored." */ if ((readRb == NULL) || (drawRb == NULL)) { - readRb = drawRb = NULL; mask &= ~GL_DEPTH_BUFFER_BIT; } else if (_mesa_get_format_bits(readRb->Format, GL_DEPTH_BITS) != diff --git a/mesalib/src/mesa/main/framebuffer.c b/mesalib/src/mesa/main/framebuffer.c index e30f31a39..6d5e4524a 100644 --- a/mesalib/src/mesa/main/framebuffer.c +++ b/mesalib/src/mesa/main/framebuffer.c @@ -34,7 +34,6 @@ #include "imports.h" #include "buffers.h" #include "context.h" -#include "depthstencil.h" #include "enums.h" #include "formats.h" #include "macros.h" @@ -307,24 +306,6 @@ _mesa_resize_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb, } } - if (fb->_DepthBuffer) { - struct gl_renderbuffer *rb = fb->_DepthBuffer; - if (rb->Width != width || rb->Height != height) { - if (!rb->AllocStorage(ctx, rb, rb->InternalFormat, width, height)) { - _mesa_error(ctx, GL_OUT_OF_MEMORY, "Resizing framebuffer"); - } - } - } - - if (fb->_StencilBuffer) { - struct gl_renderbuffer *rb = fb->_StencilBuffer; - if (rb->Width != width || rb->Height != height) { - if (!rb->AllocStorage(ctx, rb, rb->InternalFormat, width, height)) { - _mesa_error(ctx, GL_OUT_OF_MEMORY, "Resizing framebuffer"); - } - } - } - fb->Width = width; fb->Height = height; @@ -600,80 +581,6 @@ _mesa_update_framebuffer_visual(struct gl_context *ctx, } -/** - * Update the framebuffer's _DepthBuffer field using the renderbuffer - * found at the given attachment index. - * - * If that attachment points to a combined GL_DEPTH_STENCIL renderbuffer, - * create and install a depth wrapper/adaptor. - * - * \param fb the framebuffer whose _DepthBuffer field to update - */ -static void -update_depth_buffer(struct gl_context *ctx, struct gl_framebuffer *fb) -{ - struct gl_renderbuffer *depthRb = - fb->Attachment[BUFFER_DEPTH].Renderbuffer; - - if (depthRb && _mesa_is_format_packed_depth_stencil(depthRb->Format)) { - /* The attached depth buffer is a GL_DEPTH_STENCIL renderbuffer */ - if (!fb->_DepthBuffer - || fb->_DepthBuffer->Wrapped != depthRb - || _mesa_get_format_base_format(fb->_DepthBuffer->Format) != GL_DEPTH_COMPONENT) { - /* need to update wrapper */ - struct gl_renderbuffer *wrapper; - - if (depthRb->Format == MESA_FORMAT_Z32_FLOAT_X24S8) { - wrapper = _mesa_new_z32f_renderbuffer_wrapper(ctx, depthRb); - } - else { - wrapper = _mesa_new_z24_renderbuffer_wrapper(ctx, depthRb); - } - _mesa_reference_renderbuffer(&fb->_DepthBuffer, wrapper); - ASSERT(fb->_DepthBuffer->Wrapped == depthRb); - } - } - else { - /* depthRb may be null */ - _mesa_reference_renderbuffer(&fb->_DepthBuffer, depthRb); - } -} - - -/** - * Update the framebuffer's _StencilBuffer field using the renderbuffer - * found at the given attachment index. - * - * If that attachment points to a combined GL_DEPTH_STENCIL renderbuffer, - * create and install a stencil wrapper/adaptor. - * - * \param fb the framebuffer whose _StencilBuffer field to update - */ -static void -update_stencil_buffer(struct gl_context *ctx, struct gl_framebuffer *fb) -{ - struct gl_renderbuffer *stencilRb = - fb->Attachment[BUFFER_STENCIL].Renderbuffer; - - if (stencilRb && _mesa_is_format_packed_depth_stencil(stencilRb->Format)) { - /* The attached stencil buffer is a GL_DEPTH_STENCIL renderbuffer */ - if (!fb->_StencilBuffer - || fb->_StencilBuffer->Wrapped != stencilRb - || _mesa_get_format_base_format(fb->_StencilBuffer->Format) != GL_STENCIL_INDEX) { - /* need to update wrapper */ - struct gl_renderbuffer *wrapper - = _mesa_new_s8_renderbuffer_wrapper(ctx, stencilRb); - _mesa_reference_renderbuffer(&fb->_StencilBuffer, wrapper); - ASSERT(fb->_StencilBuffer->Wrapped == stencilRb); - } - } - else { - /* stencilRb may be null */ - _mesa_reference_renderbuffer(&fb->_StencilBuffer, stencilRb); - } -} - - /* * Example DrawBuffers scenarios: * @@ -812,8 +719,6 @@ update_framebuffer(struct gl_context *ctx, struct gl_framebuffer *fb) */ update_color_draw_buffers(ctx, fb); update_color_read_buffer(ctx, fb); - update_depth_buffer(ctx, fb); - update_stencil_buffer(ctx, fb); compute_depth_max(fb); } diff --git a/mesalib/src/mesa/main/mtypes.h b/mesalib/src/mesa/main/mtypes.h index fc494f748..1e06cd55c 100644 --- a/mesalib/src/mesa/main/mtypes.h +++ b/mesalib/src/mesa/main/mtypes.h @@ -2650,8 +2650,9 @@ struct gl_framebuffer struct gl_renderbuffer *_ColorDrawBuffers[MAX_DRAW_BUFFERS]; struct gl_renderbuffer *_ColorReadBuffer; - /** The Actual depth/stencil buffers to use. May be wrappers around the - * depth/stencil buffers attached above. */ + /** Wrappers to make combined depth/stencil buffers look like separate + * buffers. Only used by swrast. Will be removed in the future. + */ struct gl_renderbuffer *_DepthBuffer; struct gl_renderbuffer *_StencilBuffer; diff --git a/mesalib/src/mesa/sources.mak b/mesalib/src/mesa/sources.mak index a3ce85535..09cdd261b 100644 --- a/mesalib/src/mesa/sources.mak +++ b/mesalib/src/mesa/sources.mak @@ -27,7 +27,6 @@ MAIN_SOURCES = \ main/cpuinfo.c \ main/debug.c \ main/depth.c \ - main/depthstencil.c \ main/dlist.c \ main/dlopen.c \ main/drawpix.c \ @@ -134,6 +133,7 @@ SWRAST_SOURCES = \ swrast/s_copypix.c \ swrast/s_context.c \ swrast/s_depth.c \ + swrast/s_depthstencil.c \ swrast/s_drawpix.c \ swrast/s_feedback.c \ swrast/s_fog.c \ diff --git a/mesalib/src/mesa/state_tracker/st_cb_drawpixels.c b/mesalib/src/mesa/state_tracker/st_cb_drawpixels.c index 912241b35..65b444552 100644 --- a/mesalib/src/mesa/state_tracker/st_cb_drawpixels.c +++ b/mesalib/src/mesa/state_tracker/st_cb_drawpixels.c @@ -1182,12 +1182,9 @@ copy_stencil_pixels(struct gl_context *ctx, GLint srcx, GLint srcy, return; } - /* Get the dest renderbuffer. If there's a wrapper, use the - * underlying renderbuffer. - */ - rbDraw = st_renderbuffer(ctx->DrawBuffer->_StencilBuffer); - if (rbDraw->Base.Wrapped) - rbDraw = st_renderbuffer(rbDraw->Base.Wrapped); + /* Get the dest renderbuffer */ + rbDraw = st_renderbuffer(ctx->DrawBuffer-> + Attachment[BUFFER_STENCIL].Renderbuffer); /* this will do stencil pixel transfer ops */ _mesa_readpixels(ctx, srcx, srcy, width, height, @@ -1484,7 +1481,8 @@ st_CopyPixels(struct gl_context *ctx, GLint srcx, GLint srcy, } else { assert(type == GL_DEPTH); - rbRead = st_renderbuffer(ctx->ReadBuffer->_DepthBuffer); + rbRead = st_renderbuffer(ctx->ReadBuffer-> + Attachment[BUFFER_DEPTH].Renderbuffer); color = ctx->Current.Attrib[VERT_ATTRIB_COLOR0]; fpv = get_depth_stencil_fp_variant(st, GL_TRUE, GL_FALSE); @@ -1496,10 +1494,6 @@ st_CopyPixels(struct gl_context *ctx, GLint srcx, GLint srcy, /* update fragment program constants */ st_upload_constants(st, fpv->parameters, PIPE_SHADER_FRAGMENT); - - if (rbRead->Base.Wrapped) - rbRead = st_renderbuffer(rbRead->Base.Wrapped); - sample_count = rbRead->texture->nr_samples; /* I believe this would be legal, presumably would need to do a resolve for color, and for depth/stencil spec says to just use one of the diff --git a/mesalib/src/mesa/state_tracker/st_cb_texture.c b/mesalib/src/mesa/state_tracker/st_cb_texture.c index 52f654d7d..289ad5114 100644 --- a/mesalib/src/mesa/state_tracker/st_cb_texture.c +++ b/mesalib/src/mesa/state_tracker/st_cb_texture.c @@ -1385,10 +1385,7 @@ st_copy_texsubimage(struct gl_context *ctx, /* determine if copying depth or color data */ if (texBaseFormat == GL_DEPTH_COMPONENT || texBaseFormat == GL_DEPTH_STENCIL) { - strb = st_renderbuffer(fb->_DepthBuffer); - if (strb->Base.Wrapped) { - strb = st_renderbuffer(strb->Base.Wrapped); - } + strb = st_renderbuffer(fb->Attachment[BUFFER_DEPTH].Renderbuffer); } else { /* texBaseFormat == GL_RGB, GL_RGBA, GL_ALPHA, etc */ diff --git a/mesalib/src/mesa/swrast/s_blit.c b/mesalib/src/mesa/swrast/s_blit.c index f094be898..2817ec12f 100644 --- a/mesalib/src/mesa/swrast/s_blit.c +++ b/mesalib/src/mesa/swrast/s_blit.c @@ -573,6 +573,9 @@ _swrast_BlitFramebuffer(struct gl_context *ctx, return; } + if (SWRAST_CONTEXT(ctx)->NewState) + _swrast_validate_derived(ctx); + swrast_render_start(ctx); if (srcX1 - srcX0 == dstX1 - dstX0 && diff --git a/mesalib/src/mesa/swrast/s_clear.c b/mesalib/src/mesa/swrast/s_clear.c index 615747d69..851f6d165 100644 --- a/mesalib/src/mesa/swrast/s_clear.c +++ b/mesalib/src/mesa/swrast/s_clear.c @@ -213,6 +213,9 @@ _swrast_Clear(struct gl_context *ctx, GLbitfield buffers) if (!_mesa_check_conditional_render(ctx)) return; /* don't clear */ + if (SWRAST_CONTEXT(ctx)->NewState) + _swrast_validate_derived(ctx); + swrast_render_start(ctx); /* do software clearing here */ diff --git a/mesalib/src/mesa/swrast/s_context.c b/mesalib/src/mesa/swrast/s_context.c index 924612578..6850a09f3 100644 --- a/mesalib/src/mesa/swrast/s_context.c +++ b/mesalib/src/mesa/swrast/s_context.c @@ -36,6 +36,7 @@ #include "swrast.h" #include "s_blend.h" #include "s_context.h" +#include "s_depthstencil.h" #include "s_lines.h" #include "s_points.h" #include "s_span.h" @@ -545,6 +546,25 @@ _swrast_update_active_attribs(struct gl_context *ctx) } +/** + * Update the depth/stencil renderbuffers, if needed. + */ +static void +_swrast_update_depth_stencil(struct gl_context *ctx) +{ + struct gl_framebuffer *drawFb = ctx->DrawBuffer; + struct gl_framebuffer *readFb = ctx->ReadBuffer; + + _swrast_update_depth_buffer(ctx, drawFb); + _swrast_update_stencil_buffer(ctx, drawFb); + + if (readFb != drawFb) { + _swrast_update_depth_buffer(ctx, readFb); + _swrast_update_stencil_buffer(ctx, readFb); + } +} + + void _swrast_validate_derived( struct gl_context *ctx ) { @@ -589,6 +609,9 @@ _swrast_validate_derived( struct gl_context *ctx ) _NEW_TEXTURE)) _swrast_update_specular_vertex_add(ctx); + if (swrast->NewState & _NEW_BUFFERS) + _swrast_update_depth_stencil(ctx); + swrast->NewState = 0; swrast->StateChanges = 0; swrast->InvalidateState = _swrast_invalidate_state; diff --git a/mesalib/src/mesa/main/depthstencil.c b/mesalib/src/mesa/swrast/s_depthstencil.c index af5c12f67..dc768e216 100644 --- a/mesalib/src/mesa/main/depthstencil.c +++ b/mesalib/src/mesa/swrast/s_depthstencil.c @@ -22,13 +22,13 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#include "glheader.h" -#include "imports.h" -#include "context.h" -#include "formats.h" -#include "mtypes.h" -#include "depthstencil.h" -#include "renderbuffer.h" +#include "main/glheader.h" +#include "main/imports.h" +#include "main/context.h" +#include "main/formats.h" +#include "main/mtypes.h" +#include "main/renderbuffer.h" +#include "swrast/s_depthstencil.h" /** @@ -349,9 +349,9 @@ put_mono_values_z24(struct gl_context *ctx, struct gl_renderbuffer *z24rb, * a depth renderbuffer. * \return new depth renderbuffer */ -struct gl_renderbuffer * -_mesa_new_z24_renderbuffer_wrapper(struct gl_context *ctx, - struct gl_renderbuffer *dsrb) +static struct gl_renderbuffer * +new_z24_renderbuffer_wrapper(struct gl_context *ctx, + struct gl_renderbuffer *dsrb) { struct gl_renderbuffer *z24rb; @@ -563,9 +563,9 @@ put_mono_values_z32f(struct gl_context *ctx, struct gl_renderbuffer *z32frb, * a depth renderbuffer. * \return new depth renderbuffer */ -struct gl_renderbuffer * -_mesa_new_z32f_renderbuffer_wrapper(struct gl_context *ctx, - struct gl_renderbuffer *dsrb) +static struct gl_renderbuffer * +new_z32f_renderbuffer_wrapper(struct gl_context *ctx, + struct gl_renderbuffer *dsrb) { struct gl_renderbuffer *z32frb; @@ -915,8 +915,8 @@ put_mono_values_s8(struct gl_context *ctx, struct gl_renderbuffer *s8rb, GLuint * a stencil renderbuffer. * \return new stencil renderbuffer */ -struct gl_renderbuffer * -_mesa_new_s8_renderbuffer_wrapper(struct gl_context *ctx, struct gl_renderbuffer *dsrb) +static struct gl_renderbuffer * +new_s8_renderbuffer_wrapper(struct gl_context *ctx, struct gl_renderbuffer *dsrb) { struct gl_renderbuffer *s8rb; @@ -957,3 +957,81 @@ _mesa_new_s8_renderbuffer_wrapper(struct gl_context *ctx, struct gl_renderbuffer return s8rb; } + + +/** + * Update the framebuffer's _DepthBuffer field using the renderbuffer + * found at the given attachment index. + * + * If that attachment points to a combined GL_DEPTH_STENCIL renderbuffer, + * create and install a depth wrapper/adaptor. + * + * \param fb the framebuffer whose _DepthBuffer field to update + */ +void +_swrast_update_depth_buffer(struct gl_context *ctx, struct gl_framebuffer *fb) +{ + struct gl_renderbuffer *depthRb = + fb->Attachment[BUFFER_DEPTH].Renderbuffer; + + if (depthRb && _mesa_is_format_packed_depth_stencil(depthRb->Format)) { + /* The attached depth buffer is a GL_DEPTH_STENCIL renderbuffer */ + if (!fb->_DepthBuffer + || fb->_DepthBuffer->Wrapped != depthRb + || _mesa_get_format_base_format(fb->_DepthBuffer->Format) != GL_DEPTH_COMPONENT) { + /* need to update wrapper */ + struct gl_renderbuffer *wrapper; + + if (depthRb->Format == MESA_FORMAT_Z32_FLOAT_X24S8) { + wrapper = new_z32f_renderbuffer_wrapper(ctx, depthRb); + } + else { + wrapper = new_z24_renderbuffer_wrapper(ctx, depthRb); + } + _mesa_reference_renderbuffer(&fb->_DepthBuffer, wrapper); + } + ASSERT(fb->_DepthBuffer->Wrapped == depthRb); + fb->_DepthBuffer->Width = depthRb->Width; + fb->_DepthBuffer->Height = depthRb->Height; + } + else { + /* depthRb may be null */ + _mesa_reference_renderbuffer(&fb->_DepthBuffer, depthRb); + } +} + + +/** + * Update the framebuffer's _StencilBuffer field using the renderbuffer + * found at the given attachment index. + * + * If that attachment points to a combined GL_DEPTH_STENCIL renderbuffer, + * create and install a stencil wrapper/adaptor. + * + * \param fb the framebuffer whose _StencilBuffer field to update + */ +void +_swrast_update_stencil_buffer(struct gl_context *ctx, struct gl_framebuffer *fb) +{ + struct gl_renderbuffer *stencilRb = + fb->Attachment[BUFFER_STENCIL].Renderbuffer; + + if (stencilRb && _mesa_is_format_packed_depth_stencil(stencilRb->Format)) { + /* The attached stencil buffer is a GL_DEPTH_STENCIL renderbuffer */ + if (!fb->_StencilBuffer + || fb->_StencilBuffer->Wrapped != stencilRb + || _mesa_get_format_base_format(fb->_StencilBuffer->Format) != GL_STENCIL_INDEX) { + /* need to update wrapper */ + struct gl_renderbuffer *wrapper + = new_s8_renderbuffer_wrapper(ctx, stencilRb); + _mesa_reference_renderbuffer(&fb->_StencilBuffer, wrapper); + } + ASSERT(fb->_StencilBuffer->Wrapped == stencilRb); + fb->_StencilBuffer->Width = stencilRb->Width; + fb->_StencilBuffer->Height = stencilRb->Height; + } + else { + /* stencilRb may be null */ + _mesa_reference_renderbuffer(&fb->_StencilBuffer, stencilRb); + } +} diff --git a/mesalib/src/mesa/main/depthstencil.h b/mesalib/src/mesa/swrast/s_depthstencil.h index c3871d805..0bf624a7b 100644 --- a/mesalib/src/mesa/main/depthstencil.h +++ b/mesalib/src/mesa/swrast/s_depthstencil.h @@ -23,24 +23,17 @@ */ -#ifndef DEPTHSTENCIL_H -#define DEPTHSTENCIL_H +#ifndef S_DEPTHSTENCIL_H +#define S_DEPTHSTENCIL_H struct gl_context; +struct gl_framebuffer; -extern struct gl_renderbuffer * -_mesa_new_z24_renderbuffer_wrapper(struct gl_context *ctx, - struct gl_renderbuffer *dsrb); +void +_swrast_update_depth_buffer(struct gl_context *ctx, struct gl_framebuffer *fb); +void +_swrast_update_stencil_buffer(struct gl_context *ctx, struct gl_framebuffer *fb); -extern struct gl_renderbuffer * -_mesa_new_z32f_renderbuffer_wrapper(struct gl_context *ctx, - struct gl_renderbuffer *dsrb); - -extern struct gl_renderbuffer * -_mesa_new_s8_renderbuffer_wrapper(struct gl_context *ctx, - struct gl_renderbuffer *dsrb); - - -#endif /* DEPTHSTENCIL_H */ +#endif /* S_DEPTHSTENCIL_H */ diff --git a/mesalib/src/mesa/swrast/s_renderbuffer.c b/mesalib/src/mesa/swrast/s_renderbuffer.c index 7622e38fd..bb7cdebfe 100644 --- a/mesalib/src/mesa/swrast/s_renderbuffer.c +++ b/mesalib/src/mesa/swrast/s_renderbuffer.c @@ -1888,6 +1888,31 @@ add_stencil_renderbuffer(struct gl_context *ctx, struct gl_framebuffer *fb, } +static GLboolean +add_depth_stencil_renderbuffer(struct gl_context *ctx, + struct gl_framebuffer *fb) +{ + struct gl_renderbuffer *rb; + + assert(fb->Attachment[BUFFER_DEPTH].Renderbuffer == NULL); + assert(fb->Attachment[BUFFER_STENCIL].Renderbuffer == NULL); + + rb = _mesa_new_renderbuffer(ctx, 0); + if (!rb) { + _mesa_error(ctx, GL_OUT_OF_MEMORY, "Allocating depth+stencil buffer"); + return GL_FALSE; + } + + rb->InternalFormat = GL_DEPTH_STENCIL; + + rb->AllocStorage = soft_renderbuffer_storage; + _mesa_add_renderbuffer(fb, BUFFER_DEPTH, rb); + _mesa_add_renderbuffer(fb, BUFFER_STENCIL, rb); + + return GL_TRUE; +} + + /** * Add a software-based accumulation renderbuffer to the given framebuffer. * This is a helper routine for device drivers when creating a @@ -1999,14 +2024,29 @@ _swrast_add_soft_renderbuffers(struct gl_framebuffer *fb, frontRight, backRight); } - if (depth) { - assert(fb->Visual.depthBits > 0); - add_depth_renderbuffer(NULL, fb, fb->Visual.depthBits); - } +#if 0 + /* This is pretty much for debugging purposes only since there's a perf + * hit for using combined depth/stencil in swrast. + */ + if (depth && fb->Visual.depthBits == 24 && + stencil && fb->Visual.stencilBits == 8) { + /* use combined depth/stencil buffer */ + add_depth_stencil_renderbuffer(NULL, fb); + } + else +#else + (void) add_depth_stencil_renderbuffer; +#endif + { + if (depth) { + assert(fb->Visual.depthBits > 0); + add_depth_renderbuffer(NULL, fb, fb->Visual.depthBits); + } - if (stencil) { - assert(fb->Visual.stencilBits > 0); - add_stencil_renderbuffer(NULL, fb, fb->Visual.stencilBits); + if (stencil) { + assert(fb->Visual.stencilBits > 0); + add_stencil_renderbuffer(NULL, fb, fb->Visual.stencilBits); + } } if (accum) { diff --git a/pixman/pixman/pixman-cpu.c b/pixman/pixman/pixman-cpu.c index dff27d1ea..4172e52f6 100644 --- a/pixman/pixman/pixman-cpu.c +++ b/pixman/pixman/pixman-cpu.c @@ -244,6 +244,43 @@ pixman_have_arm_neon (void) #endif /* USE_ARM_NEON */ +#elif defined (__linux__) || defined(__ANDROID__) || defined(ANDROID) /* linux ELF or ANDROID */ + +static pixman_bool_t arm_has_v7 = FALSE; +static pixman_bool_t arm_has_v6 = FALSE; +static pixman_bool_t arm_has_vfp = FALSE; +static pixman_bool_t arm_has_neon = FALSE; +static pixman_bool_t arm_has_iwmmxt = FALSE; +static pixman_bool_t arm_tests_initialized = FALSE; + +#if defined(__ANDROID__) || defined(ANDROID) /* Android device support */ + +#include <cpu-features.h> + +static void +pixman_arm_read_auxv_or_cpu_features () +{ + AndroidCpuFamily cpu_family; + uint64_t cpu_features; + + cpu_family = android_getCpuFamily(); + cpu_features = android_getCpuFeatures(); + + if (cpu_family == ANDROID_CPU_FAMILY_ARM) + { + if (cpu_features & ANDROID_CPU_ARM_FEATURE_ARMv7) + arm_has_v7 = TRUE; + + if (cpu_features & ANDROID_CPU_ARM_FEATURE_VFPv3) + arm_has_vfp = TRUE; + + if (cpu_features & ANDROID_CPU_ARM_FEATURE_NEON) + arm_has_neon = TRUE; + } + + arm_tests_initialized = TRUE; +} + #elif defined (__linux__) /* linux ELF */ #include <stdlib.h> @@ -255,15 +292,8 @@ pixman_have_arm_neon (void) #include <string.h> #include <elf.h> -static pixman_bool_t arm_has_v7 = FALSE; -static pixman_bool_t arm_has_v6 = FALSE; -static pixman_bool_t arm_has_vfp = FALSE; -static pixman_bool_t arm_has_neon = FALSE; -static pixman_bool_t arm_has_iwmmxt = FALSE; -static pixman_bool_t arm_tests_initialized = FALSE; - static void -pixman_arm_read_auxv () +pixman_arm_read_auxv_or_cpu_features () { int fd; Elf32_auxv_t aux; @@ -304,12 +334,14 @@ pixman_arm_read_auxv () arm_tests_initialized = TRUE; } +#endif /* Linux elf */ + #if defined(USE_ARM_SIMD) pixman_bool_t pixman_have_arm_simd (void) { if (!arm_tests_initialized) - pixman_arm_read_auxv (); + pixman_arm_read_auxv_or_cpu_features (); return arm_has_v6; } @@ -321,7 +353,7 @@ pixman_bool_t pixman_have_arm_neon (void) { if (!arm_tests_initialized) - pixman_arm_read_auxv (); + pixman_arm_read_auxv_or_cpu_features (); return arm_has_neon; } @@ -333,14 +365,14 @@ pixman_bool_t pixman_have_arm_iwmmxt (void) { if (!arm_tests_initialized) - pixman_arm_read_auxv (); + pixman_arm_read_auxv_or_cpu_features (); return arm_has_iwmmxt; } #endif /* USE_ARM_IWMMXT */ -#else /* linux ELF */ +#else /* !_MSC_VER && !Linux elf && !Android */ #define pixman_have_arm_simd() FALSE #define pixman_have_arm_neon() FALSE |