r600g: put depth and stencil into one backing buffer
For DRI2 sharing.
This commit is contained in:
parent
68c54abb2c
commit
7f29824fd5
|
@ -363,7 +363,8 @@ r600_texture_create_object(struct pipe_screen *screen,
|
||||||
unsigned array_mode,
|
unsigned array_mode,
|
||||||
unsigned pitch_in_bytes_override,
|
unsigned pitch_in_bytes_override,
|
||||||
unsigned max_buffer_size,
|
unsigned max_buffer_size,
|
||||||
struct r600_bo *bo)
|
struct r600_bo *bo,
|
||||||
|
boolean alloc_bo)
|
||||||
{
|
{
|
||||||
struct r600_resource_texture *rtex;
|
struct r600_resource_texture *rtex;
|
||||||
struct r600_resource *resource;
|
struct r600_resource *resource;
|
||||||
|
@ -415,7 +416,8 @@ r600_texture_create_object(struct pipe_screen *screen,
|
||||||
stencil = *base;
|
stencil = *base;
|
||||||
stencil.format = PIPE_FORMAT_S8_USCALED;
|
stencil.format = PIPE_FORMAT_S8_USCALED;
|
||||||
rtex->stencil = r600_texture_create_object(screen, &stencil, array_mode,
|
rtex->stencil = r600_texture_create_object(screen, &stencil, array_mode,
|
||||||
stencil_pitch_override, max_buffer_size, bo);
|
stencil_pitch_override,
|
||||||
|
max_buffer_size, NULL, FALSE);
|
||||||
if (!rtex->stencil) {
|
if (!rtex->stencil) {
|
||||||
FREE(rtex);
|
FREE(rtex);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -429,11 +431,8 @@ r600_texture_create_object(struct pipe_screen *screen,
|
||||||
|
|
||||||
r600_setup_miptree(screen, rtex, array_mode);
|
r600_setup_miptree(screen, rtex, array_mode);
|
||||||
|
|
||||||
resource->size = rtex->size;
|
/* If we initialized separate stencil for Evergreen. place it after depth. */
|
||||||
|
if (rtex->stencil) {
|
||||||
/* If bo is not NULL, in which case depth and stencil must share the same buffer,
|
|
||||||
* and we initialized separate stencil for Evergreen. place it after depth. */
|
|
||||||
if (bo && rtex->stencil) {
|
|
||||||
unsigned stencil_align, stencil_offset;
|
unsigned stencil_align, stencil_offset;
|
||||||
|
|
||||||
stencil_align = r600_get_base_alignment(screen, rtex->stencil->real_format, array_mode);
|
stencil_align = r600_get_base_alignment(screen, rtex->stencil->real_format, array_mode);
|
||||||
|
@ -441,9 +440,14 @@ r600_texture_create_object(struct pipe_screen *screen,
|
||||||
|
|
||||||
for (unsigned i = 0; i <= rtex->stencil->resource.b.b.b.last_level; i++)
|
for (unsigned i = 0; i <= rtex->stencil->resource.b.b.b.last_level; i++)
|
||||||
rtex->stencil->offset[i] += stencil_offset;
|
rtex->stencil->offset[i] += stencil_offset;
|
||||||
|
|
||||||
|
rtex->size = stencil_offset + rtex->stencil->size;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!resource->bo) {
|
resource->size = rtex->size;
|
||||||
|
|
||||||
|
/* Now create the backing buffer. */
|
||||||
|
if (!resource->bo && alloc_bo) {
|
||||||
struct pipe_resource *ptex = &rtex->resource.b.b.b;
|
struct pipe_resource *ptex = &rtex->resource.b.b.b;
|
||||||
unsigned base_align = r600_get_base_alignment(screen, ptex->format, array_mode);
|
unsigned base_align = r600_get_base_alignment(screen, ptex->format, array_mode);
|
||||||
|
|
||||||
|
@ -454,6 +458,9 @@ r600_texture_create_object(struct pipe_screen *screen,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (rtex->stencil)
|
||||||
|
rtex->stencil->resource.bo = rtex->resource.bo;
|
||||||
return rtex;
|
return rtex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -487,7 +494,7 @@ struct pipe_resource *r600_texture_create(struct pipe_screen *screen,
|
||||||
array_mode = V_038000_ARRAY_1D_TILED_THIN1;
|
array_mode = V_038000_ARRAY_1D_TILED_THIN1;
|
||||||
|
|
||||||
return (struct pipe_resource *)r600_texture_create_object(screen, templ, array_mode,
|
return (struct pipe_resource *)r600_texture_create_object(screen, templ, array_mode,
|
||||||
0, 0, NULL);
|
0, 0, NULL, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pipe_surface *r600_create_surface(struct pipe_context *pipe,
|
static struct pipe_surface *r600_create_surface(struct pipe_context *pipe,
|
||||||
|
@ -548,7 +555,7 @@ struct pipe_resource *r600_texture_from_handle(struct pipe_screen *screen,
|
||||||
}
|
}
|
||||||
|
|
||||||
return (struct pipe_resource *)r600_texture_create_object(screen, templ, array_mode,
|
return (struct pipe_resource *)r600_texture_create_object(screen, templ, array_mode,
|
||||||
stride, 0, bo);
|
stride, 0, bo, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
int r600_texture_depth_flush(struct pipe_context *ctx,
|
int r600_texture_depth_flush(struct pipe_context *ctx,
|
||||||
|
|
Loading…
Reference in New Issue