aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesalib/src/mesa/SConscript2
-rw-r--r--mesalib/src/mesa/main/fbobject.c14
-rw-r--r--mesalib/src/mesa/main/framebuffer.c95
-rw-r--r--mesalib/src/mesa/main/mtypes.h5
-rw-r--r--mesalib/src/mesa/sources.mak2
-rw-r--r--mesalib/src/mesa/state_tracker/st_cb_drawpixels.c16
-rw-r--r--mesalib/src/mesa/state_tracker/st_cb_texture.c5
-rw-r--r--mesalib/src/mesa/swrast/s_blit.c3
-rw-r--r--mesalib/src/mesa/swrast/s_clear.c3
-rw-r--r--mesalib/src/mesa/swrast/s_context.c23
-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.c54
-rw-r--r--pixman/pixman/pixman-cpu.c56
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