st/mesa: separate sw renderbuffer allocation from hw one
Reviewed-by: Brian Paul <brianp@vmware.com>
This commit is contained in:
parent
a82227ce4a
commit
e4b2e6b527
|
@ -57,6 +57,44 @@
|
||||||
#include "util/u_surface.h"
|
#include "util/u_surface.h"
|
||||||
|
|
||||||
|
|
||||||
|
static GLboolean
|
||||||
|
st_renderbuffer_alloc_sw_storage(struct gl_context * ctx,
|
||||||
|
struct gl_renderbuffer *rb,
|
||||||
|
GLenum internalFormat,
|
||||||
|
GLuint width, GLuint height)
|
||||||
|
{
|
||||||
|
struct pipe_screen *screen = st_context(ctx)->pipe->screen;
|
||||||
|
struct st_renderbuffer *strb = st_renderbuffer(rb);
|
||||||
|
enum pipe_format format;
|
||||||
|
size_t size;
|
||||||
|
|
||||||
|
free(strb->data);
|
||||||
|
strb->data = NULL;
|
||||||
|
|
||||||
|
if (internalFormat == GL_RGBA16_SNORM) {
|
||||||
|
/* Special case for software accum buffers. Otherwise, if the
|
||||||
|
* call to st_choose_renderbuffer_format() fails (because the
|
||||||
|
* driver doesn't support signed 16-bit/channel colors) we'd
|
||||||
|
* just return without allocating the software accum buffer.
|
||||||
|
*/
|
||||||
|
format = PIPE_FORMAT_R16G16B16A16_SNORM;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
format = st_choose_renderbuffer_format(screen, internalFormat, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (format == PIPE_FORMAT_NONE) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
strb->Base.Format = st_pipe_format_to_mesa_format(format);
|
||||||
|
|
||||||
|
size = _mesa_format_image_size(strb->Base.Format, width, height, 1);
|
||||||
|
strb->data = malloc(size);
|
||||||
|
return strb->data != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* gl_renderbuffer::AllocStorage()
|
* gl_renderbuffer::AllocStorage()
|
||||||
* This is called to allocate the original drawing surface, and
|
* This is called to allocate the original drawing surface, and
|
||||||
|
@ -74,98 +112,78 @@ st_renderbuffer_alloc_storage(struct gl_context * ctx,
|
||||||
struct st_renderbuffer *strb = st_renderbuffer(rb);
|
struct st_renderbuffer *strb = st_renderbuffer(rb);
|
||||||
enum pipe_format format;
|
enum pipe_format format;
|
||||||
struct pipe_surface surf_tmpl;
|
struct pipe_surface surf_tmpl;
|
||||||
|
struct pipe_resource templ;
|
||||||
|
|
||||||
if (internalFormat == GL_RGBA16_SNORM && strb->software) {
|
/* init renderbuffer fields */
|
||||||
/* Special case for software accum buffers. Otherwise, if the
|
strb->Base.Width = width;
|
||||||
* call to st_choose_renderbuffer_format() fails (because the
|
strb->Base.Height = height;
|
||||||
* driver doesn't support signed 16-bit/channel colors) we'd
|
strb->Base._BaseFormat = _mesa_base_fbo_format(ctx, internalFormat);
|
||||||
* just return without allocating the software accum buffer.
|
strb->defined = GL_FALSE; /* undefined contents now */
|
||||||
*/
|
|
||||||
format = PIPE_FORMAT_R16G16B16A16_SNORM;
|
if (strb->software) {
|
||||||
}
|
return st_renderbuffer_alloc_sw_storage(ctx, rb, internalFormat,
|
||||||
else {
|
width, height);
|
||||||
format = st_choose_renderbuffer_format(screen, internalFormat,
|
|
||||||
rb->NumSamples);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Free the old surface and texture
|
||||||
|
*/
|
||||||
|
pipe_surface_reference( &strb->surface, NULL );
|
||||||
|
pipe_resource_reference( &strb->texture, NULL );
|
||||||
|
|
||||||
|
format = st_choose_renderbuffer_format(screen, internalFormat,
|
||||||
|
rb->NumSamples);
|
||||||
|
|
||||||
if (format == PIPE_FORMAT_NONE) {
|
if (format == PIPE_FORMAT_NONE) {
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* init renderbuffer fields */
|
|
||||||
strb->Base.Width = width;
|
|
||||||
strb->Base.Height = height;
|
|
||||||
strb->Base.Format = st_pipe_format_to_mesa_format(format);
|
strb->Base.Format = st_pipe_format_to_mesa_format(format);
|
||||||
strb->Base._BaseFormat = _mesa_base_fbo_format(ctx, internalFormat);
|
|
||||||
|
|
||||||
strb->defined = GL_FALSE; /* undefined contents now */
|
if (width == 0 || height == 0) {
|
||||||
|
/* if size is zero, nothing to allocate */
|
||||||
|
return GL_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
if (strb->software) {
|
/* Setup new texture template.
|
||||||
size_t size;
|
*/
|
||||||
|
memset(&templ, 0, sizeof(templ));
|
||||||
free(strb->data);
|
templ.target = st->internal_target;
|
||||||
|
templ.format = format;
|
||||||
size = _mesa_format_image_size(strb->Base.Format, width, height, 1);
|
templ.width0 = width;
|
||||||
|
templ.height0 = height;
|
||||||
strb->data = malloc(size);
|
templ.depth0 = 1;
|
||||||
|
templ.array_size = 1;
|
||||||
return strb->data != NULL;
|
templ.nr_samples = rb->NumSamples;
|
||||||
|
if (util_format_is_depth_or_stencil(format)) {
|
||||||
|
templ.bind = PIPE_BIND_DEPTH_STENCIL;
|
||||||
|
}
|
||||||
|
else if (strb->Base.Name != 0) {
|
||||||
|
/* this is a user-created renderbuffer */
|
||||||
|
templ.bind = PIPE_BIND_RENDER_TARGET;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
struct pipe_resource template;
|
/* this is a window-system buffer */
|
||||||
|
templ.bind = (PIPE_BIND_DISPLAY_TARGET |
|
||||||
/* Free the old surface and texture
|
PIPE_BIND_RENDER_TARGET);
|
||||||
*/
|
|
||||||
pipe_surface_reference( &strb->surface, NULL );
|
|
||||||
pipe_resource_reference( &strb->texture, NULL );
|
|
||||||
|
|
||||||
if (width == 0 || height == 0) {
|
|
||||||
/* if size is zero, nothing to allocate */
|
|
||||||
return GL_TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Setup new texture template.
|
|
||||||
*/
|
|
||||||
memset(&template, 0, sizeof(template));
|
|
||||||
template.target = st->internal_target;
|
|
||||||
template.format = format;
|
|
||||||
template.width0 = width;
|
|
||||||
template.height0 = height;
|
|
||||||
template.depth0 = 1;
|
|
||||||
template.array_size = 1;
|
|
||||||
template.last_level = 0;
|
|
||||||
template.nr_samples = rb->NumSamples;
|
|
||||||
if (util_format_is_depth_or_stencil(format)) {
|
|
||||||
template.bind = PIPE_BIND_DEPTH_STENCIL;
|
|
||||||
}
|
|
||||||
else if (strb->Base.Name != 0) {
|
|
||||||
/* this is a user-created renderbuffer */
|
|
||||||
template.bind = PIPE_BIND_RENDER_TARGET;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
/* this is a window-system buffer */
|
|
||||||
template.bind = (PIPE_BIND_DISPLAY_TARGET |
|
|
||||||
PIPE_BIND_RENDER_TARGET);
|
|
||||||
}
|
|
||||||
|
|
||||||
strb->texture = screen->resource_create(screen, &template);
|
|
||||||
|
|
||||||
if (!strb->texture)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
u_surface_default_template(&surf_tmpl, strb->texture, template.bind);
|
|
||||||
strb->surface = pipe->create_surface(pipe,
|
|
||||||
strb->texture,
|
|
||||||
&surf_tmpl);
|
|
||||||
if (strb->surface) {
|
|
||||||
assert(strb->surface->texture);
|
|
||||||
assert(strb->surface->format);
|
|
||||||
assert(strb->surface->width == width);
|
|
||||||
assert(strb->surface->height == height);
|
|
||||||
}
|
|
||||||
|
|
||||||
return strb->surface != NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
strb->texture = screen->resource_create(screen, &templ);
|
||||||
|
|
||||||
|
if (!strb->texture)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
u_surface_default_template(&surf_tmpl, strb->texture, templ.bind);
|
||||||
|
strb->surface = pipe->create_surface(pipe,
|
||||||
|
strb->texture,
|
||||||
|
&surf_tmpl);
|
||||||
|
if (strb->surface) {
|
||||||
|
assert(strb->surface->texture);
|
||||||
|
assert(strb->surface->format);
|
||||||
|
assert(strb->surface->width == width);
|
||||||
|
assert(strb->surface->height == height);
|
||||||
|
}
|
||||||
|
|
||||||
|
return strb->surface != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue