#include "st_cb_texture.h"
#include "st_format.h"
#include "st_public.h"
+#include "st_texture.h"
* Compute the renderbuffer's Red/Green/EtcBit fields from the pipe format.
*/
static int
-init_renderbuffer_bits(struct st_renderbuffer *strb, uint pipeFormat)
+init_renderbuffer_bits(struct st_renderbuffer *strb,
+ enum pipe_format pipeFormat)
{
struct pipe_format_info info;
{
struct pipe_context *pipe = ctx->st->pipe;
struct st_renderbuffer *strb = st_renderbuffer(rb);
- const uint pipeFormat
- = st_choose_pipe_format(pipe, internalFormat, GL_NONE, GL_NONE);
- GLuint cpp;
- GLbitfield flags = PIPE_SURFACE_FLAG_RENDER; /* want to render to surface */
-
- cpp = init_renderbuffer_bits(strb, pipeFormat);
-
- if (strb->surface && strb->surface->format != pipeFormat) {
- /* need to change surface types, free this surface */
- pipe_surface_reference(&strb->surface, NULL);
- assert(strb->surface == NULL);
- }
+ enum pipe_format pipeFormat;
+ GLbitfield flags = 0x0; /* XXX needed? */
if (!strb->surface) {
- strb->surface = pipe->winsys->surface_alloc(pipe->winsys, pipeFormat);
+ strb->surface = pipe->winsys->surface_alloc(pipe->winsys);
assert(strb->surface);
+ assert(strb->surface->refcount);
+ assert(strb->surface->winsys);
if (!strb->surface)
return GL_FALSE;
- strb->surface->cpp = cpp;
- strb->surface->pitch = pipe->winsys->surface_pitch(pipe->winsys, cpp,
- width, flags);
}
- /* free old region */
- if (strb->surface->region) {
- /* loop here since mapping is refcounted */
- struct pipe_region *r = strb->surface->region;
- while (r->map)
- pipe->region_unmap(pipe, r);
- pipe->winsys->region_release(pipe->winsys, &strb->surface->region);
+ if (strb->surface->buffer)
+ pipe_buffer_reference(pipe->winsys, &strb->surface->buffer,
+ NULL);
+
+ /* Determine surface format here */
+ if (strb->format != PIPE_FORMAT_NONE) {
+ assert(strb->format != 0);
+ /* we'll hit this for front/back color bufs */
+ pipeFormat = strb->format;
+ }
+ else {
+ pipeFormat = st_choose_renderbuffer_format(pipe, internalFormat);
}
- strb->surface->region = pipe->winsys->region_alloc(pipe->winsys,
- strb->surface->pitch *
- cpp * height, flags);
- if (!strb->surface->region)
+ init_renderbuffer_bits(strb, pipeFormat);
+
+ pipe->winsys->surface_alloc_storage(pipe->winsys,
+ strb->surface,
+ width,
+ height,
+ pipeFormat,
+ flags);
+ if (!strb->surface->buffer)
return GL_FALSE; /* out of memory, try s/w buffer? */
- ASSERT(strb->surface->region->buffer);
+ ASSERT(strb->surface->buffer);
ASSERT(strb->surface->format);
+ ASSERT(strb->surface->cpp);
+ ASSERT(strb->surface->width == width);
+ ASSERT(strb->surface->height == height);
+ ASSERT(strb->surface->pitch);
- strb->Base.Width = strb->surface->width = width;
- strb->Base.Height = strb->surface->height = height;
+ strb->Base.Width = width;
+ strb->Base.Height = height;
return GL_TRUE;
}
strb->Base.Delete = st_renderbuffer_delete;
strb->Base.AllocStorage = st_renderbuffer_alloc_storage;
strb->Base.GetPointer = null_get_pointer;
+ strb->format = PIPE_FORMAT_NONE;
return &strb->Base;
}
return NULL;
/**
* Allocate a renderbuffer for a an on-screen window (not a user-created
- * renderbuffer). The window system code determines the internal format.
+ * renderbuffer). The window system code determines the format.
*/
struct gl_renderbuffer *
-st_new_renderbuffer_fb(GLenum intFormat)
+st_new_renderbuffer_fb(enum pipe_format format)
{
struct st_renderbuffer *strb;
_mesa_init_renderbuffer(&strb->Base, 0);
strb->Base.ClassID = 0x4242; /* just a unique value */
- strb->Base.InternalFormat = intFormat;
-
- switch (intFormat) {
- case GL_RGB5:
- case GL_RGBA8:
- case GL_RGBA16:
+ strb->format = format;
+
+ switch (format) {
+ case PIPE_FORMAT_A8R8G8B8_UNORM:
+ case PIPE_FORMAT_B8G8R8A8_UNORM:
+ case PIPE_FORMAT_A1R5G5B5_UNORM:
+ case PIPE_FORMAT_A4R4G4B4_UNORM:
+ case PIPE_FORMAT_R5G6B5_UNORM:
+ strb->Base.InternalFormat = GL_RGBA;
strb->Base._BaseFormat = GL_RGBA;
break;
- case GL_DEPTH_COMPONENT16:
- case GL_DEPTH_COMPONENT32:
+ case PIPE_FORMAT_Z16_UNORM:
+ strb->Base.InternalFormat = GL_DEPTH_COMPONENT16;
+ strb->Base._BaseFormat = GL_DEPTH_COMPONENT;
+ break;
+ case PIPE_FORMAT_Z32_UNORM:
+ strb->Base.InternalFormat = GL_DEPTH_COMPONENT32;
strb->Base._BaseFormat = GL_DEPTH_COMPONENT;
break;
- case GL_DEPTH24_STENCIL8_EXT:
+ case PIPE_FORMAT_S8Z24_UNORM:
+ case PIPE_FORMAT_Z24S8_UNORM:
+ strb->Base.InternalFormat = GL_DEPTH24_STENCIL8_EXT;
strb->Base._BaseFormat = GL_DEPTH_STENCIL_EXT;
break;
- case GL_STENCIL_INDEX8_EXT:
+ case PIPE_FORMAT_S8_UNORM:
+ strb->Base.InternalFormat = GL_STENCIL_INDEX8_EXT;
strb->Base._BaseFormat = GL_STENCIL_INDEX;
break;
+ case PIPE_FORMAT_R16G16B16A16_SNORM:
+ strb->Base.InternalFormat = GL_RGBA16;
+ strb->Base._BaseFormat = GL_RGBA;
+ break;
default:
_mesa_problem(NULL,
- "Unexpected intFormat in st_new_renderbuffer");
+ "Unexpected format in st_new_renderbuffer_fb");
return NULL;
}
+
/**
* Called via ctx->Driver.BindFramebufferEXT().
*/
struct st_renderbuffer *strb;
struct gl_renderbuffer *rb;
struct pipe_context *pipe = st->pipe;
+ struct pipe_screen *screen = pipe->screen;
struct pipe_texture *pt;
assert(!att->Renderbuffer);
rb->Height = pt->height[att->TextureLevel];
/* the renderbuffer's surface is inside the texture */
- strb->surface = pipe->get_tex_surface(pipe, pt,
- att->CubeMapFace,
- att->TextureLevel,
- att->Zoffset);
+ strb->surface = screen->get_tex_surface(screen, pt,
+ att->CubeMapFace,
+ att->TextureLevel,
+ att->Zoffset);
assert(strb->surface);
init_renderbuffer_bits(strb, pt->format);
assert(strb);
- ctx->st->pipe->flush(ctx->st->pipe, 0x0);
+ ctx->st->pipe->flush(ctx->st->pipe, PIPE_FLUSH_RENDER_CACHE);
/*
printf("FINISH RENDER TO TEXTURE surf=%p\n", strb->surface);