summaryrefslogtreecommitdiffstats
path: root/src/mesa/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/main')
-rw-r--r--src/mesa/main/mtypes.h3
-rw-r--r--src/mesa/main/renderbuffer.c22
2 files changed, 23 insertions, 2 deletions
diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
index 52448ee04eb..d70df5d945c 100644
--- a/src/mesa/main/mtypes.h
+++ b/src/mesa/main/mtypes.h
@@ -127,6 +127,7 @@ struct gl_texture_format;
struct gl_texture_image;
struct gl_texture_object;
struct st_context;
+struct pipe_surface;
typedef struct __GLcontextRec GLcontext;
typedef struct __GLcontextModesRec GLvisual;
typedef struct gl_framebuffer GLframebuffer;
@@ -2268,6 +2269,8 @@ struct gl_renderbuffer
GLubyte StencilBits;
GLvoid *Data; /**< This may not be used by some kinds of RBs */
+ struct pipe_surface *surface;
+
/* Used to wrap one renderbuffer around another: */
struct gl_renderbuffer *Wrapped;
diff --git a/src/mesa/main/renderbuffer.c b/src/mesa/main/renderbuffer.c
index 6f1d7c39605..a1412ef007c 100644
--- a/src/mesa/main/renderbuffer.c
+++ b/src/mesa/main/renderbuffer.c
@@ -49,6 +49,9 @@
#include "rbadaptors.h"
+#include "pipe/softpipe/sp_z_surface.h"
+#include "pipe/p_state.h"
+
/* 32-bit color index format. Not a public format. */
#define COLOR_INDEX32 0x424243
@@ -1091,6 +1094,7 @@ _mesa_soft_renderbuffer_storage(GLcontext *ctx, struct gl_renderbuffer *rb,
rb->PutValues = put_values_ushort;
rb->PutMonoValues = put_mono_values_ushort;
rb->DepthBits = 8 * sizeof(GLushort);
+ rb->surface = (struct pipe_surface *) softpipe_new_z_surface(16);
pixelSize = sizeof(GLushort);
break;
case GL_DEPTH_COMPONENT24:
@@ -1193,13 +1197,27 @@ _mesa_soft_renderbuffer_storage(GLcontext *ctx, struct gl_renderbuffer *rb,
/* free old buffer storage */
if (rb->Data) {
- _mesa_free(rb->Data);
+ if (rb->surface) {
+ /* pipe surface */
+ }
+ else {
+ /* legacy renderbuffer */
+ _mesa_free(rb->Data);
+ }
rb->Data = NULL;
}
if (width > 0 && height > 0) {
/* allocate new buffer storage */
- rb->Data = _mesa_malloc(width * height * pixelSize);
+ if (rb->surface) {
+ /* pipe surface */
+ rb->surface->resize(rb->surface, width, height);
+ rb->Data = rb->surface->buffer.ptr;
+ }
+ else {
+ /* legacy renderbuffer */
+ rb->Data = _mesa_malloc(width * height * pixelSize);
+ }
if (rb->Data == NULL) {
rb->Width = 0;
rb->Height = 0;