r300,r600,radeonsi: switch to pb_buffer_lean
to remove pb_buffer::vtbl from all buffer structures Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26643>
This commit is contained in:
@@ -294,14 +294,14 @@ struct r300_query {
|
|||||||
bool begin_emitted;
|
bool begin_emitted;
|
||||||
|
|
||||||
/* The buffer where query results are stored. */
|
/* The buffer where query results are stored. */
|
||||||
struct pb_buffer *buf;
|
struct pb_buffer_lean *buf;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct r300_surface {
|
struct r300_surface {
|
||||||
struct pipe_surface base;
|
struct pipe_surface base;
|
||||||
|
|
||||||
/* Winsys buffer backing the texture. */
|
/* Winsys buffer backing the texture. */
|
||||||
struct pb_buffer *buf;
|
struct pb_buffer_lean *buf;
|
||||||
|
|
||||||
enum radeon_bo_domain domain;
|
enum radeon_bo_domain domain;
|
||||||
|
|
||||||
@@ -392,7 +392,7 @@ struct r300_resource
|
|||||||
struct pipe_resource b;
|
struct pipe_resource b;
|
||||||
|
|
||||||
/* Winsys buffer backing this resource. */
|
/* Winsys buffer backing this resource. */
|
||||||
struct pb_buffer *buf;
|
struct pb_buffer_lean *buf;
|
||||||
enum radeon_bo_domain domain;
|
enum radeon_bo_domain domain;
|
||||||
|
|
||||||
/* Constant buffers and SWTCL vertex and index buffers are in user
|
/* Constant buffers and SWTCL vertex and index buffers are in user
|
||||||
@@ -456,7 +456,7 @@ struct r300_context {
|
|||||||
/* Draw module. Used mostly for SW TCL. */
|
/* Draw module. Used mostly for SW TCL. */
|
||||||
struct draw_context* draw;
|
struct draw_context* draw;
|
||||||
/* Vertex buffer for SW TCL. */
|
/* Vertex buffer for SW TCL. */
|
||||||
struct pb_buffer *vbo;
|
struct pb_buffer_lean *vbo;
|
||||||
/* Offset and size into the SW TCL VBO. */
|
/* Offset and size into the SW TCL VBO. */
|
||||||
size_t draw_vbo_offset;
|
size_t draw_vbo_offset;
|
||||||
|
|
||||||
|
|||||||
@@ -770,8 +770,8 @@ void r300_emit_query_end(struct r300_context* r300)
|
|||||||
query->num_results += query->num_pipes;
|
query->num_results += query->num_pipes;
|
||||||
|
|
||||||
/* XXX grab all the results and reset the counter. */
|
/* XXX grab all the results and reset the counter. */
|
||||||
if (query->num_results >= query->buf->base.size / 4 - 4) {
|
if (query->num_results >= query->buf->size / 4 - 4) {
|
||||||
query->num_results = (query->buf->base.size / 4) / 2;
|
query->num_results = (query->buf->size / 4) / 2;
|
||||||
fprintf(stderr, "r300: Rewinding OQBO...\n");
|
fprintf(stderr, "r300: Rewinding OQBO...\n");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -950,7 +950,7 @@ static bool r300_render_allocate_vertices(struct vbuf_render* render,
|
|||||||
|
|
||||||
DBG(r300, DBG_DRAW, "r300: render_allocate_vertices (size: %d)\n", size);
|
DBG(r300, DBG_DRAW, "r300: render_allocate_vertices (size: %d)\n", size);
|
||||||
|
|
||||||
if (!r300->vbo || size + r300->draw_vbo_offset > r300->vbo->base.size) {
|
if (!r300->vbo || size + r300->draw_vbo_offset > r300->vbo->size) {
|
||||||
radeon_bo_reference(r300->rws, &r300->vbo, NULL);
|
radeon_bo_reference(r300->rws, &r300->vbo, NULL);
|
||||||
r300->vbo = NULL;
|
r300->vbo = NULL;
|
||||||
r300render->vbo_ptr = NULL;
|
r300render->vbo_ptr = NULL;
|
||||||
@@ -1056,7 +1056,7 @@ static void r300_render_draw_elements(struct vbuf_render* render,
|
|||||||
{
|
{
|
||||||
struct r300_render* r300render = r300_render(render);
|
struct r300_render* r300render = r300_render(render);
|
||||||
struct r300_context* r300 = r300render->r300;
|
struct r300_context* r300 = r300render->r300;
|
||||||
unsigned max_index = (r300->vbo->base.size - r300->draw_vbo_offset) /
|
unsigned max_index = (r300->vbo->size - r300->draw_vbo_offset) /
|
||||||
(r300render->r300->vertex_info.size * 4) - 1;
|
(r300render->r300->vertex_info.size * 4) - 1;
|
||||||
struct pipe_resource *index_buffer = NULL;
|
struct pipe_resource *index_buffer = NULL;
|
||||||
unsigned index_buffer_offset;
|
unsigned index_buffer_offset;
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ r300_buffer_transfer_map( struct pipe_context *context,
|
|||||||
if (r300->rws->cs_is_buffer_referenced(&r300->cs, rbuf->buf, RADEON_USAGE_READWRITE) ||
|
if (r300->rws->cs_is_buffer_referenced(&r300->cs, rbuf->buf, RADEON_USAGE_READWRITE) ||
|
||||||
!r300->rws->buffer_wait(r300->rws, rbuf->buf, 0, RADEON_USAGE_READWRITE)) {
|
!r300->rws->buffer_wait(r300->rws, rbuf->buf, 0, RADEON_USAGE_READWRITE)) {
|
||||||
unsigned i;
|
unsigned i;
|
||||||
struct pb_buffer *new_buf;
|
struct pb_buffer_lean *new_buf;
|
||||||
|
|
||||||
/* Create a new one in the same pipe_resource. */
|
/* Create a new one in the same pipe_resource. */
|
||||||
new_buf = r300->rws->buffer_create(r300->rws, rbuf->b.width0,
|
new_buf = r300->rws->buffer_create(r300->rws, rbuf->b.width0,
|
||||||
|
|||||||
@@ -1033,7 +1033,7 @@ r300_texture_create_object(struct r300_screen *rscreen,
|
|||||||
enum radeon_bo_layout microtile,
|
enum radeon_bo_layout microtile,
|
||||||
enum radeon_bo_layout macrotile,
|
enum radeon_bo_layout macrotile,
|
||||||
unsigned stride_in_bytes_override,
|
unsigned stride_in_bytes_override,
|
||||||
struct pb_buffer *buffer)
|
struct pb_buffer_lean *buffer)
|
||||||
{
|
{
|
||||||
struct radeon_winsys *rws = rscreen->rws;
|
struct radeon_winsys *rws = rscreen->rws;
|
||||||
struct r300_resource *tex = NULL;
|
struct r300_resource *tex = NULL;
|
||||||
@@ -1142,7 +1142,7 @@ struct pipe_resource *r300_texture_from_handle(struct pipe_screen *screen,
|
|||||||
{
|
{
|
||||||
struct r300_screen *rscreen = r300_screen(screen);
|
struct r300_screen *rscreen = r300_screen(screen);
|
||||||
struct radeon_winsys *rws = rscreen->rws;
|
struct radeon_winsys *rws = rscreen->rws;
|
||||||
struct pb_buffer *buffer;
|
struct pb_buffer_lean *buffer;
|
||||||
struct radeon_bo_metadata tiling = {};
|
struct radeon_bo_metadata tiling = {};
|
||||||
|
|
||||||
/* Support only 2D textures without mipmaps */
|
/* Support only 2D textures without mipmaps */
|
||||||
|
|||||||
@@ -606,17 +606,17 @@ void r300_texture_desc_init(struct r300_screen *rscreen,
|
|||||||
r300_setup_miptree(rscreen, tex, true);
|
r300_setup_miptree(rscreen, tex, true);
|
||||||
/* If the required buffer size is larger than the given max size,
|
/* If the required buffer size is larger than the given max size,
|
||||||
* try again without the alignment for the CBZB clear. */
|
* try again without the alignment for the CBZB clear. */
|
||||||
if (tex->buf && tex->tex.size_in_bytes > tex->buf->base.size) {
|
if (tex->buf && tex->tex.size_in_bytes > tex->buf->size) {
|
||||||
r300_setup_miptree(rscreen, tex, false);
|
r300_setup_miptree(rscreen, tex, false);
|
||||||
|
|
||||||
/* Make sure the buffer we got is large enough. */
|
/* Make sure the buffer we got is large enough. */
|
||||||
if (tex->tex.size_in_bytes > tex->buf->base.size) {
|
if (tex->tex.size_in_bytes > tex->buf->size) {
|
||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"r300: I got a pre-allocated buffer to use it as a texture "
|
"r300: I got a pre-allocated buffer to use it as a texture "
|
||||||
"storage, but the buffer is too small. I'll use the buffer "
|
"storage, but the buffer is too small. I'll use the buffer "
|
||||||
"anyway, because I can't crash here, but it's dangerous. "
|
"anyway, because I can't crash here, but it's dangerous. "
|
||||||
"This can be a DDX bug. Got: %"PRIu64"B, Need: %uB, Info:\n",
|
"This can be a DDX bug. Got: %"PRIu64"B, Need: %uB, Info:\n",
|
||||||
tex->buf->base.size, tex->tex.size_in_bytes);
|
tex->buf->size, tex->tex.size_in_bytes);
|
||||||
r300_tex_print_info(tex, "texture_desc_init");
|
r300_tex_print_info(tex, "texture_desc_init");
|
||||||
/* Oops, what now. Apps will break if we fail this,
|
/* Oops, what now. Apps will break if we fail this,
|
||||||
* so just pretend everything's okay. */
|
* so just pretend everything's okay. */
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
bool r600_rings_is_buffer_referenced(struct r600_common_context *ctx,
|
bool r600_rings_is_buffer_referenced(struct r600_common_context *ctx,
|
||||||
struct pb_buffer *buf,
|
struct pb_buffer_lean *buf,
|
||||||
unsigned usage)
|
unsigned usage)
|
||||||
{
|
{
|
||||||
if (ctx->ws->cs_is_buffer_referenced(&ctx->gfx.cs, buf, usage)) {
|
if (ctx->ws->cs_is_buffer_referenced(&ctx->gfx.cs, buf, usage)) {
|
||||||
@@ -166,7 +166,7 @@ void r600_init_resource_fields(struct r600_common_screen *rscreen,
|
|||||||
bool r600_alloc_resource(struct r600_common_screen *rscreen,
|
bool r600_alloc_resource(struct r600_common_screen *rscreen,
|
||||||
struct r600_resource *res)
|
struct r600_resource *res)
|
||||||
{
|
{
|
||||||
struct pb_buffer *old_buf, *new_buf;
|
struct pb_buffer_lean *old_buf, *new_buf;
|
||||||
|
|
||||||
/* Allocate a new resource. */
|
/* Allocate a new resource. */
|
||||||
new_buf = rscreen->ws->buffer_create(rscreen->ws, res->bo_size,
|
new_buf = rscreen->ws->buffer_create(rscreen->ws, res->bo_size,
|
||||||
@@ -195,8 +195,8 @@ bool r600_alloc_resource(struct r600_common_screen *rscreen,
|
|||||||
/* Print debug information. */
|
/* Print debug information. */
|
||||||
if (rscreen->debug_flags & DBG_VM && res->b.b.target == PIPE_BUFFER) {
|
if (rscreen->debug_flags & DBG_VM && res->b.b.target == PIPE_BUFFER) {
|
||||||
fprintf(stderr, "VM start=0x%"PRIX64" end=0x%"PRIX64" | Buffer %"PRIu64" bytes\n",
|
fprintf(stderr, "VM start=0x%"PRIX64" end=0x%"PRIX64" | Buffer %"PRIu64" bytes\n",
|
||||||
res->gpu_address, res->gpu_address + res->buf->base.size,
|
res->gpu_address, res->gpu_address + res->buf->size,
|
||||||
res->buf->base.size);
|
res->buf->size);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ struct r600_resource {
|
|||||||
struct threaded_resource b;
|
struct threaded_resource b;
|
||||||
|
|
||||||
/* Winsys objects. */
|
/* Winsys objects. */
|
||||||
struct pb_buffer *buf;
|
struct pb_buffer_lean *buf;
|
||||||
uint64_t gpu_address;
|
uint64_t gpu_address;
|
||||||
/* Memory usage if the buffer placement is optimal. */
|
/* Memory usage if the buffer placement is optimal. */
|
||||||
uint64_t vram_usage;
|
uint64_t vram_usage;
|
||||||
@@ -314,7 +314,7 @@ union r600_mmio_counters {
|
|||||||
|
|
||||||
struct r600_memory_object {
|
struct r600_memory_object {
|
||||||
struct pipe_memory_object b;
|
struct pipe_memory_object b;
|
||||||
struct pb_buffer *buf;
|
struct pb_buffer_lean *buf;
|
||||||
uint32_t stride;
|
uint32_t stride;
|
||||||
uint32_t offset;
|
uint32_t offset;
|
||||||
};
|
};
|
||||||
@@ -616,7 +616,7 @@ struct r600_common_context {
|
|||||||
|
|
||||||
/* r600_buffer_common.c */
|
/* r600_buffer_common.c */
|
||||||
bool r600_rings_is_buffer_referenced(struct r600_common_context *ctx,
|
bool r600_rings_is_buffer_referenced(struct r600_common_context *ctx,
|
||||||
struct pb_buffer *buf,
|
struct pb_buffer_lean *buf,
|
||||||
unsigned usage);
|
unsigned usage);
|
||||||
void *r600_buffer_map_sync_with_rings(struct r600_common_context *ctx,
|
void *r600_buffer_map_sync_with_rings(struct r600_common_context *ctx,
|
||||||
struct r600_resource *resource,
|
struct r600_resource *resource,
|
||||||
|
|||||||
@@ -990,7 +990,7 @@ static void r600_init_color_surface(struct r600_context *rctx,
|
|||||||
/* CMASK. */
|
/* CMASK. */
|
||||||
if (!rctx->dummy_cmask ||
|
if (!rctx->dummy_cmask ||
|
||||||
rctx->dummy_cmask->b.b.width0 < cmask.size ||
|
rctx->dummy_cmask->b.b.width0 < cmask.size ||
|
||||||
(1 << rctx->dummy_cmask->buf->base.alignment_log2) % cmask.alignment != 0) {
|
(1 << rctx->dummy_cmask->buf->alignment_log2) % cmask.alignment != 0) {
|
||||||
struct pipe_transfer *transfer;
|
struct pipe_transfer *transfer;
|
||||||
void *ptr;
|
void *ptr;
|
||||||
|
|
||||||
@@ -1015,7 +1015,7 @@ static void r600_init_color_surface(struct r600_context *rctx,
|
|||||||
/* FMASK. */
|
/* FMASK. */
|
||||||
if (!rctx->dummy_fmask ||
|
if (!rctx->dummy_fmask ||
|
||||||
rctx->dummy_fmask->b.b.width0 < fmask.size ||
|
rctx->dummy_fmask->b.b.width0 < fmask.size ||
|
||||||
(1 << rctx->dummy_fmask->buf->base.alignment_log2) % fmask.alignment != 0) {
|
(1 << rctx->dummy_fmask->buf->alignment_log2) % fmask.alignment != 0) {
|
||||||
r600_resource_reference(&rctx->dummy_fmask, NULL);
|
r600_resource_reference(&rctx->dummy_fmask, NULL);
|
||||||
rctx->dummy_fmask = (struct r600_resource*)
|
rctx->dummy_fmask = (struct r600_resource*)
|
||||||
r600_aligned_buffer_create(&rscreen->b.b, 0,
|
r600_aligned_buffer_create(&rscreen->b.b, 0,
|
||||||
|
|||||||
@@ -897,7 +897,7 @@ void r600_print_texture_info(struct r600_common_screen *rscreen,
|
|||||||
static struct r600_texture *
|
static struct r600_texture *
|
||||||
r600_texture_create_object(struct pipe_screen *screen,
|
r600_texture_create_object(struct pipe_screen *screen,
|
||||||
const struct pipe_resource *base,
|
const struct pipe_resource *base,
|
||||||
struct pb_buffer *buf,
|
struct pb_buffer_lean *buf,
|
||||||
struct radeon_surf *surface)
|
struct radeon_surf *surface)
|
||||||
{
|
{
|
||||||
struct r600_texture *rtex;
|
struct r600_texture *rtex;
|
||||||
@@ -973,13 +973,13 @@ r600_texture_create_object(struct pipe_screen *screen,
|
|||||||
} else {
|
} else {
|
||||||
resource->buf = buf;
|
resource->buf = buf;
|
||||||
resource->gpu_address = rscreen->ws->buffer_get_virtual_address(resource->buf);
|
resource->gpu_address = rscreen->ws->buffer_get_virtual_address(resource->buf);
|
||||||
resource->bo_size = buf->base.size;
|
resource->bo_size = buf->size;
|
||||||
resource->bo_alignment = 1 << buf->base.alignment_log2;
|
resource->bo_alignment = 1 << buf->alignment_log2;
|
||||||
resource->domains = rscreen->ws->buffer_get_initial_domain(resource->buf);
|
resource->domains = rscreen->ws->buffer_get_initial_domain(resource->buf);
|
||||||
if (resource->domains & RADEON_DOMAIN_VRAM)
|
if (resource->domains & RADEON_DOMAIN_VRAM)
|
||||||
resource->vram_usage = buf->base.size;
|
resource->vram_usage = buf->size;
|
||||||
else if (resource->domains & RADEON_DOMAIN_GTT)
|
else if (resource->domains & RADEON_DOMAIN_GTT)
|
||||||
resource->gart_usage = buf->base.size;
|
resource->gart_usage = buf->size;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rtex->cmask.size) {
|
if (rtex->cmask.size) {
|
||||||
@@ -1004,7 +1004,7 @@ r600_texture_create_object(struct pipe_screen *screen,
|
|||||||
if (rscreen->debug_flags & DBG_VM) {
|
if (rscreen->debug_flags & DBG_VM) {
|
||||||
fprintf(stderr, "VM start=0x%"PRIX64" end=0x%"PRIX64" | Texture %ix%ix%i, %i levels, %i samples, %s\n",
|
fprintf(stderr, "VM start=0x%"PRIX64" end=0x%"PRIX64" | Texture %ix%ix%i, %i levels, %i samples, %s\n",
|
||||||
rtex->resource.gpu_address,
|
rtex->resource.gpu_address,
|
||||||
rtex->resource.gpu_address + rtex->resource.buf->base.size,
|
rtex->resource.gpu_address + rtex->resource.buf->size,
|
||||||
base->width0, base->height0, util_num_layers(base, 0), base->last_level+1,
|
base->width0, base->height0, util_num_layers(base, 0), base->last_level+1,
|
||||||
base->nr_samples ? base->nr_samples : 1, util_format_short_name(base->format));
|
base->nr_samples ? base->nr_samples : 1, util_format_short_name(base->format));
|
||||||
}
|
}
|
||||||
@@ -1107,7 +1107,7 @@ static struct pipe_resource *r600_texture_from_handle(struct pipe_screen *screen
|
|||||||
unsigned usage)
|
unsigned usage)
|
||||||
{
|
{
|
||||||
struct r600_common_screen *rscreen = (struct r600_common_screen*)screen;
|
struct r600_common_screen *rscreen = (struct r600_common_screen*)screen;
|
||||||
struct pb_buffer *buf = NULL;
|
struct pb_buffer_lean *buf = NULL;
|
||||||
enum radeon_surf_mode array_mode;
|
enum radeon_surf_mode array_mode;
|
||||||
struct radeon_surf surface = {};
|
struct radeon_surf surface = {};
|
||||||
int r;
|
int r;
|
||||||
@@ -1486,7 +1486,7 @@ void r600_texture_transfer_unmap(struct pipe_context *ctx,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (rtransfer->staging) {
|
if (rtransfer->staging) {
|
||||||
rctx->num_alloc_tex_transfer_bytes += rtransfer->staging->buf->base.size;
|
rctx->num_alloc_tex_transfer_bytes += rtransfer->staging->buf->size;
|
||||||
r600_resource_reference(&rtransfer->staging, NULL);
|
r600_resource_reference(&rtransfer->staging, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1778,7 +1778,7 @@ r600_memobj_from_handle(struct pipe_screen *screen,
|
|||||||
{
|
{
|
||||||
struct r600_common_screen *rscreen = (struct r600_common_screen*)screen;
|
struct r600_common_screen *rscreen = (struct r600_common_screen*)screen;
|
||||||
struct r600_memory_object *memobj = CALLOC_STRUCT(r600_memory_object);
|
struct r600_memory_object *memobj = CALLOC_STRUCT(r600_memory_object);
|
||||||
struct pb_buffer *buf = NULL;
|
struct pb_buffer_lean *buf = NULL;
|
||||||
|
|
||||||
if (!memobj)
|
if (!memobj)
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -1824,7 +1824,7 @@ r600_texture_from_memobj(struct pipe_screen *screen,
|
|||||||
struct radeon_bo_metadata metadata = {};
|
struct radeon_bo_metadata metadata = {};
|
||||||
enum radeon_surf_mode array_mode;
|
enum radeon_surf_mode array_mode;
|
||||||
bool is_scanout;
|
bool is_scanout;
|
||||||
struct pb_buffer *buf = NULL;
|
struct pb_buffer_lean *buf = NULL;
|
||||||
|
|
||||||
if (memobj->b.dedicated) {
|
if (memobj->b.dedicated) {
|
||||||
rscreen->ws->buffer_get_metadata(rscreen->ws, memobj->buf, &metadata, NULL);
|
rscreen->ws->buffer_get_metadata(rscreen->ws, memobj->buf, &metadata, NULL);
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ struct pipe_video_buffer *r600_video_buffer_create(struct pipe_context *pipe,
|
|||||||
struct r600_context *ctx = (struct r600_context *)pipe;
|
struct r600_context *ctx = (struct r600_context *)pipe;
|
||||||
struct r600_texture *resources[VL_NUM_COMPONENTS] = {};
|
struct r600_texture *resources[VL_NUM_COMPONENTS] = {};
|
||||||
struct radeon_surf* surfaces[VL_NUM_COMPONENTS] = {};
|
struct radeon_surf* surfaces[VL_NUM_COMPONENTS] = {};
|
||||||
struct pb_buffer **pbs[VL_NUM_COMPONENTS] = {};
|
struct pb_buffer_lean **pbs[VL_NUM_COMPONENTS] = {};
|
||||||
enum pipe_format resource_formats[3];
|
enum pipe_format resource_formats[3];
|
||||||
struct pipe_video_buffer template;
|
struct pipe_video_buffer template;
|
||||||
struct pipe_resource templ;
|
struct pipe_resource templ;
|
||||||
@@ -156,7 +156,7 @@ static uint32_t eg_num_banks(uint32_t nbanks)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* set the decoding target buffer offsets */
|
/* set the decoding target buffer offsets */
|
||||||
static struct pb_buffer* r600_uvd_set_dtb(struct ruvd_msg *msg, struct vl_video_buffer *buf)
|
static struct pb_buffer_lean* r600_uvd_set_dtb(struct ruvd_msg *msg, struct vl_video_buffer *buf)
|
||||||
{
|
{
|
||||||
struct r600_screen *rscreen = (struct r600_screen*)buf->base.context->screen;
|
struct r600_screen *rscreen = (struct r600_screen*)buf->base.context->screen;
|
||||||
struct r600_texture *luma = (struct r600_texture *)buf->resources[0];
|
struct r600_texture *luma = (struct r600_texture *)buf->resources[0];
|
||||||
@@ -172,7 +172,7 @@ static struct pb_buffer* r600_uvd_set_dtb(struct ruvd_msg *msg, struct vl_video_
|
|||||||
|
|
||||||
/* get the radeon resources for VCE */
|
/* get the radeon resources for VCE */
|
||||||
static void r600_vce_get_buffer(struct pipe_resource *resource,
|
static void r600_vce_get_buffer(struct pipe_resource *resource,
|
||||||
struct pb_buffer **handle,
|
struct pb_buffer_lean **handle,
|
||||||
struct radeon_surf **surface)
|
struct radeon_surf **surface)
|
||||||
{
|
{
|
||||||
struct r600_texture *res = (struct r600_texture *)resource;
|
struct r600_texture *res = (struct r600_texture *)resource;
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ static void set_reg(struct ruvd_decoder *dec, unsigned reg, uint32_t val)
|
|||||||
|
|
||||||
/* send a command to the VCPU through the GPCOM registers */
|
/* send a command to the VCPU through the GPCOM registers */
|
||||||
static void send_cmd(struct ruvd_decoder *dec, unsigned cmd,
|
static void send_cmd(struct ruvd_decoder *dec, unsigned cmd,
|
||||||
struct pb_buffer* buf, uint32_t off,
|
struct pb_buffer_lean* buf, uint32_t off,
|
||||||
unsigned usage, enum radeon_bo_domain domain)
|
unsigned usage, enum radeon_bo_domain domain)
|
||||||
{
|
{
|
||||||
int reloc_idx;
|
int reloc_idx;
|
||||||
@@ -257,38 +257,38 @@ static unsigned calc_dpb_size(struct ruvd_decoder *dec)
|
|||||||
case PIPE_VIDEO_FORMAT_MPEG4_AVC: {
|
case PIPE_VIDEO_FORMAT_MPEG4_AVC: {
|
||||||
if (!dec->use_legacy) {
|
if (!dec->use_legacy) {
|
||||||
unsigned fs_in_mb = width_in_mb * height_in_mb;
|
unsigned fs_in_mb = width_in_mb * height_in_mb;
|
||||||
unsigned alignment = 64, num_dpb_buffer;
|
unsigned alignment = 64, num_dpb_buffer_lean;
|
||||||
|
|
||||||
if (dec->stream_type == RUVD_CODEC_H264_PERF)
|
if (dec->stream_type == RUVD_CODEC_H264_PERF)
|
||||||
alignment = 256;
|
alignment = 256;
|
||||||
switch(dec->base.level) {
|
switch(dec->base.level) {
|
||||||
case 30:
|
case 30:
|
||||||
num_dpb_buffer = 8100 / fs_in_mb;
|
num_dpb_buffer_lean = 8100 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 31:
|
case 31:
|
||||||
num_dpb_buffer = 18000 / fs_in_mb;
|
num_dpb_buffer_lean = 18000 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 32:
|
case 32:
|
||||||
num_dpb_buffer = 20480 / fs_in_mb;
|
num_dpb_buffer_lean = 20480 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 41:
|
case 41:
|
||||||
num_dpb_buffer = 32768 / fs_in_mb;
|
num_dpb_buffer_lean = 32768 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 42:
|
case 42:
|
||||||
num_dpb_buffer = 34816 / fs_in_mb;
|
num_dpb_buffer_lean = 34816 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 50:
|
case 50:
|
||||||
num_dpb_buffer = 110400 / fs_in_mb;
|
num_dpb_buffer_lean = 110400 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 51:
|
case 51:
|
||||||
num_dpb_buffer = 184320 / fs_in_mb;
|
num_dpb_buffer_lean = 184320 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
num_dpb_buffer = 184320 / fs_in_mb;
|
num_dpb_buffer_lean = 184320 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
num_dpb_buffer++;
|
num_dpb_buffer_lean++;
|
||||||
max_references = MAX2(MIN2(NUM_H264_REFS, num_dpb_buffer), max_references);
|
max_references = MAX2(MIN2(NUM_H264_REFS, num_dpb_buffer_lean), max_references);
|
||||||
dpb_size = image_size * max_references;
|
dpb_size = image_size * max_references;
|
||||||
if ((dec->stream_type != RUVD_CODEC_H264_PERF)) {
|
if ((dec->stream_type != RUVD_CODEC_H264_PERF)) {
|
||||||
dpb_size += max_references * align(width_in_mb * height_in_mb * 192, alignment);
|
dpb_size += max_references * align(width_in_mb * height_in_mb * 192, alignment);
|
||||||
@@ -887,7 +887,7 @@ static void ruvd_decode_bitstream(struct pipe_video_codec *decoder,
|
|||||||
if (format == PIPE_VIDEO_FORMAT_JPEG)
|
if (format == PIPE_VIDEO_FORMAT_JPEG)
|
||||||
new_size += 2; /* save for EOI */
|
new_size += 2; /* save for EOI */
|
||||||
|
|
||||||
if (new_size > buf->res->buf->base.size) {
|
if (new_size > buf->res->buf->size) {
|
||||||
dec->ws->buffer_unmap(dec->ws, buf->res->buf);
|
dec->ws->buffer_unmap(dec->ws, buf->res->buf);
|
||||||
dec->bs_ptr = NULL;
|
dec->bs_ptr = NULL;
|
||||||
if (!rvid_resize_buffer(dec->screen, &dec->cs, buf, new_size)) {
|
if (!rvid_resize_buffer(dec->screen, &dec->cs, buf, new_size)) {
|
||||||
@@ -925,7 +925,7 @@ static void ruvd_end_frame(struct pipe_video_codec *decoder,
|
|||||||
struct pipe_picture_desc *picture)
|
struct pipe_picture_desc *picture)
|
||||||
{
|
{
|
||||||
struct ruvd_decoder *dec = (struct ruvd_decoder*)decoder;
|
struct ruvd_decoder *dec = (struct ruvd_decoder*)decoder;
|
||||||
struct pb_buffer *dt;
|
struct pb_buffer_lean *dt;
|
||||||
struct rvid_buffer *msg_fb_it_buf, *bs_buf;
|
struct rvid_buffer *msg_fb_it_buf, *bs_buf;
|
||||||
unsigned bs_size;
|
unsigned bs_size;
|
||||||
|
|
||||||
@@ -960,7 +960,7 @@ static void ruvd_end_frame(struct pipe_video_codec *decoder,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (dec->dpb.res)
|
if (dec->dpb.res)
|
||||||
dec->msg->body.decode.dpb_size = dec->dpb.res->buf->base.size;
|
dec->msg->body.decode.dpb_size = dec->dpb.res->buf->size;
|
||||||
dec->msg->body.decode.bsd_size = bs_size;
|
dec->msg->body.decode.bsd_size = bs_size;
|
||||||
dec->msg->body.decode.db_pitch = align(dec->base.width, get_db_pitch_alignment(dec));
|
dec->msg->body.decode.db_pitch = align(dec->base.width, get_db_pitch_alignment(dec));
|
||||||
|
|
||||||
|
|||||||
@@ -428,7 +428,7 @@ struct ruvd_msg {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* driver dependent callback */
|
/* driver dependent callback */
|
||||||
typedef struct pb_buffer* (*ruvd_set_dtb)
|
typedef struct pb_buffer_lean* (*ruvd_set_dtb)
|
||||||
(struct ruvd_msg* msg, struct vl_video_buffer *vb);
|
(struct ruvd_msg* msg, struct vl_video_buffer *vb);
|
||||||
|
|
||||||
/* create an UVD decode */
|
/* create an UVD decode */
|
||||||
|
|||||||
@@ -513,7 +513,7 @@ bool rvce_is_fw_version_supported(struct r600_common_screen *rscreen)
|
|||||||
/**
|
/**
|
||||||
* Add the buffer as relocation to the current command submission
|
* Add the buffer as relocation to the current command submission
|
||||||
*/
|
*/
|
||||||
void rvce_add_buffer(struct rvce_encoder *enc, struct pb_buffer *buf,
|
void rvce_add_buffer(struct rvce_encoder *enc, struct pb_buffer_lean *buf,
|
||||||
unsigned usage, enum radeon_bo_domain domain,
|
unsigned usage, enum radeon_bo_domain domain,
|
||||||
signed offset)
|
signed offset)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -52,7 +52,7 @@ struct r600_common_screen;
|
|||||||
|
|
||||||
/* driver dependent callback */
|
/* driver dependent callback */
|
||||||
typedef void (*rvce_get_buffer)(struct pipe_resource *resource,
|
typedef void (*rvce_get_buffer)(struct pipe_resource *resource,
|
||||||
struct pb_buffer **handle,
|
struct pb_buffer_lean **handle,
|
||||||
struct radeon_surf **surface);
|
struct radeon_surf **surface);
|
||||||
|
|
||||||
/* Coded picture buffer slot */
|
/* Coded picture buffer slot */
|
||||||
@@ -391,11 +391,11 @@ struct rvce_encoder {
|
|||||||
|
|
||||||
rvce_get_buffer get_buffer;
|
rvce_get_buffer get_buffer;
|
||||||
|
|
||||||
struct pb_buffer* handle;
|
struct pb_buffer_lean* handle;
|
||||||
struct radeon_surf* luma;
|
struct radeon_surf* luma;
|
||||||
struct radeon_surf* chroma;
|
struct radeon_surf* chroma;
|
||||||
|
|
||||||
struct pb_buffer* bs_handle;
|
struct pb_buffer_lean* bs_handle;
|
||||||
unsigned bs_size;
|
unsigned bs_size;
|
||||||
|
|
||||||
struct rvce_cpb_slot *cpb_array;
|
struct rvce_cpb_slot *cpb_array;
|
||||||
@@ -430,7 +430,7 @@ struct pipe_video_codec *rvce_create_encoder(struct pipe_context *context,
|
|||||||
|
|
||||||
bool rvce_is_fw_version_supported(struct r600_common_screen *rscreen);
|
bool rvce_is_fw_version_supported(struct r600_common_screen *rscreen);
|
||||||
|
|
||||||
void rvce_add_buffer(struct rvce_encoder *enc, struct pb_buffer *buf,
|
void rvce_add_buffer(struct rvce_encoder *enc, struct pb_buffer_lean *buf,
|
||||||
unsigned usage, enum radeon_bo_domain domain,
|
unsigned usage, enum radeon_bo_domain domain,
|
||||||
signed offset);
|
signed offset);
|
||||||
|
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ bool rvid_resize_buffer(struct pipe_screen *screen, struct radeon_cmdbuf *cs,
|
|||||||
{
|
{
|
||||||
struct r600_common_screen *rscreen = (struct r600_common_screen *)screen;
|
struct r600_common_screen *rscreen = (struct r600_common_screen *)screen;
|
||||||
struct radeon_winsys* ws = rscreen->ws;
|
struct radeon_winsys* ws = rscreen->ws;
|
||||||
unsigned bytes = MIN2(new_buf->res->buf->base.size, new_size);
|
unsigned bytes = MIN2(new_buf->res->buf->size, new_size);
|
||||||
struct rvid_buffer old_buf = *new_buf;
|
struct rvid_buffer old_buf = *new_buf;
|
||||||
void *src = NULL, *dst = NULL;
|
void *src = NULL, *dst = NULL;
|
||||||
|
|
||||||
@@ -132,7 +132,7 @@ void rvid_clear_buffer(struct pipe_context *context, struct rvid_buffer* buffer)
|
|||||||
struct r600_common_context *rctx = (struct r600_common_context*)context;
|
struct r600_common_context *rctx = (struct r600_common_context*)context;
|
||||||
|
|
||||||
rctx->dma_clear_buffer(context, &buffer->res->b.b, 0,
|
rctx->dma_clear_buffer(context, &buffer->res->b.b, 0,
|
||||||
buffer->res->buf->base.size, 0);
|
buffer->res->buf->size, 0);
|
||||||
context->flush(context, NULL, 0);
|
context->flush(context, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -141,13 +141,13 @@ void rvid_clear_buffer(struct pipe_context *context, struct rvid_buffer* buffer)
|
|||||||
* sumup their sizes and replace the backend buffers with a single bo
|
* sumup their sizes and replace the backend buffers with a single bo
|
||||||
*/
|
*/
|
||||||
void rvid_join_surfaces(struct r600_common_context *rctx,
|
void rvid_join_surfaces(struct r600_common_context *rctx,
|
||||||
struct pb_buffer** buffers[VL_NUM_COMPONENTS],
|
struct pb_buffer_lean** buffers[VL_NUM_COMPONENTS],
|
||||||
struct radeon_surf *surfaces[VL_NUM_COMPONENTS])
|
struct radeon_surf *surfaces[VL_NUM_COMPONENTS])
|
||||||
{
|
{
|
||||||
struct radeon_winsys* ws;
|
struct radeon_winsys* ws;
|
||||||
unsigned best_tiling, best_wh, off;
|
unsigned best_tiling, best_wh, off;
|
||||||
unsigned size, alignment;
|
unsigned size, alignment;
|
||||||
struct pb_buffer *pb;
|
struct pb_buffer_lean *pb;
|
||||||
unsigned i, j;
|
unsigned i, j;
|
||||||
|
|
||||||
ws = rctx->ws;
|
ws = rctx->ws;
|
||||||
@@ -189,9 +189,9 @@ void rvid_join_surfaces(struct r600_common_context *rctx,
|
|||||||
if (!buffers[i] || !*buffers[i])
|
if (!buffers[i] || !*buffers[i])
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
size = align(size, 1 << (*buffers[i])->base.alignment_log2);
|
size = align(size, 1 << (*buffers[i])->alignment_log2);
|
||||||
size += (*buffers[i])->base.size;
|
size += (*buffers[i])->size;
|
||||||
alignment = MAX2(alignment, 1 << (*buffers[i])->base.alignment_log2);
|
alignment = MAX2(alignment, 1 << (*buffers[i])->alignment_log2);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!size)
|
if (!size)
|
||||||
|
|||||||
@@ -67,7 +67,7 @@ void rvid_clear_buffer(struct pipe_context *context, struct rvid_buffer* buffer)
|
|||||||
/* join surfaces into the same buffer with identical tiling params
|
/* join surfaces into the same buffer with identical tiling params
|
||||||
sum up their sizes and replace the backend buffers with a single bo */
|
sum up their sizes and replace the backend buffers with a single bo */
|
||||||
void rvid_join_surfaces(struct r600_common_context *rctx,
|
void rvid_join_surfaces(struct r600_common_context *rctx,
|
||||||
struct pb_buffer** buffers[VL_NUM_COMPONENTS],
|
struct pb_buffer_lean** buffers[VL_NUM_COMPONENTS],
|
||||||
struct radeon_surf *surfaces[VL_NUM_COMPONENTS]);
|
struct radeon_surf *surfaces[VL_NUM_COMPONENTS]);
|
||||||
|
|
||||||
/* returns supported codecs and other parameters */
|
/* returns supported codecs and other parameters */
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ static void set_reg(struct ruvd_decoder *dec, unsigned reg, uint32_t val)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* send a command to the VCPU through the GPCOM registers */
|
/* send a command to the VCPU through the GPCOM registers */
|
||||||
static void send_cmd(struct ruvd_decoder *dec, unsigned cmd, struct pb_buffer *buf, uint32_t off,
|
static void send_cmd(struct ruvd_decoder *dec, unsigned cmd, struct pb_buffer_lean *buf, uint32_t off,
|
||||||
unsigned usage, enum radeon_bo_domain domain)
|
unsigned usage, enum radeon_bo_domain domain)
|
||||||
{
|
{
|
||||||
int reloc_idx;
|
int reloc_idx;
|
||||||
@@ -226,35 +226,35 @@ static unsigned calc_ctx_size_h264_perf(struct ruvd_decoder *dec)
|
|||||||
|
|
||||||
if (!dec->use_legacy) {
|
if (!dec->use_legacy) {
|
||||||
unsigned fs_in_mb = width_in_mb * height_in_mb;
|
unsigned fs_in_mb = width_in_mb * height_in_mb;
|
||||||
unsigned num_dpb_buffer;
|
unsigned num_dpb_buffer_lean;
|
||||||
switch (dec->base.level) {
|
switch (dec->base.level) {
|
||||||
case 30:
|
case 30:
|
||||||
num_dpb_buffer = 8100 / fs_in_mb;
|
num_dpb_buffer_lean = 8100 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 31:
|
case 31:
|
||||||
num_dpb_buffer = 18000 / fs_in_mb;
|
num_dpb_buffer_lean = 18000 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 32:
|
case 32:
|
||||||
num_dpb_buffer = 20480 / fs_in_mb;
|
num_dpb_buffer_lean = 20480 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 41:
|
case 41:
|
||||||
num_dpb_buffer = 32768 / fs_in_mb;
|
num_dpb_buffer_lean = 32768 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 42:
|
case 42:
|
||||||
num_dpb_buffer = 34816 / fs_in_mb;
|
num_dpb_buffer_lean = 34816 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 50:
|
case 50:
|
||||||
num_dpb_buffer = 110400 / fs_in_mb;
|
num_dpb_buffer_lean = 110400 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 51:
|
case 51:
|
||||||
num_dpb_buffer = 184320 / fs_in_mb;
|
num_dpb_buffer_lean = 184320 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
num_dpb_buffer = 184320 / fs_in_mb;
|
num_dpb_buffer_lean = 184320 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
num_dpb_buffer++;
|
num_dpb_buffer_lean++;
|
||||||
max_references = MAX2(MIN2(NUM_H264_REFS, num_dpb_buffer), max_references);
|
max_references = MAX2(MIN2(NUM_H264_REFS, num_dpb_buffer_lean), max_references);
|
||||||
ctx_size = max_references * align(width_in_mb * height_in_mb * 192, 256);
|
ctx_size = max_references * align(width_in_mb * height_in_mb * 192, 256);
|
||||||
} else {
|
} else {
|
||||||
// the firmware seems to always assume a minimum of ref frames
|
// the firmware seems to always assume a minimum of ref frames
|
||||||
@@ -351,38 +351,38 @@ static unsigned calc_dpb_size(struct ruvd_decoder *dec)
|
|||||||
case PIPE_VIDEO_FORMAT_MPEG4_AVC: {
|
case PIPE_VIDEO_FORMAT_MPEG4_AVC: {
|
||||||
if (!dec->use_legacy) {
|
if (!dec->use_legacy) {
|
||||||
unsigned fs_in_mb = width_in_mb * height_in_mb;
|
unsigned fs_in_mb = width_in_mb * height_in_mb;
|
||||||
unsigned alignment = 64, num_dpb_buffer;
|
unsigned alignment = 64, num_dpb_buffer_lean;
|
||||||
|
|
||||||
if (dec->stream_type == RUVD_CODEC_H264_PERF)
|
if (dec->stream_type == RUVD_CODEC_H264_PERF)
|
||||||
alignment = 256;
|
alignment = 256;
|
||||||
switch (dec->base.level) {
|
switch (dec->base.level) {
|
||||||
case 30:
|
case 30:
|
||||||
num_dpb_buffer = 8100 / fs_in_mb;
|
num_dpb_buffer_lean = 8100 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 31:
|
case 31:
|
||||||
num_dpb_buffer = 18000 / fs_in_mb;
|
num_dpb_buffer_lean = 18000 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 32:
|
case 32:
|
||||||
num_dpb_buffer = 20480 / fs_in_mb;
|
num_dpb_buffer_lean = 20480 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 41:
|
case 41:
|
||||||
num_dpb_buffer = 32768 / fs_in_mb;
|
num_dpb_buffer_lean = 32768 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 42:
|
case 42:
|
||||||
num_dpb_buffer = 34816 / fs_in_mb;
|
num_dpb_buffer_lean = 34816 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 50:
|
case 50:
|
||||||
num_dpb_buffer = 110400 / fs_in_mb;
|
num_dpb_buffer_lean = 110400 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 51:
|
case 51:
|
||||||
num_dpb_buffer = 184320 / fs_in_mb;
|
num_dpb_buffer_lean = 184320 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
num_dpb_buffer = 184320 / fs_in_mb;
|
num_dpb_buffer_lean = 184320 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
num_dpb_buffer++;
|
num_dpb_buffer_lean++;
|
||||||
max_references = MAX2(MIN2(NUM_H264_REFS, num_dpb_buffer), max_references);
|
max_references = MAX2(MIN2(NUM_H264_REFS, num_dpb_buffer_lean), max_references);
|
||||||
dpb_size = image_size * max_references;
|
dpb_size = image_size * max_references;
|
||||||
if ((dec->stream_type != RUVD_CODEC_H264_PERF) ||
|
if ((dec->stream_type != RUVD_CODEC_H264_PERF) ||
|
||||||
(((struct si_screen *)dec->screen)->info.family < CHIP_POLARIS10)) {
|
(((struct si_screen *)dec->screen)->info.family < CHIP_POLARIS10)) {
|
||||||
@@ -1046,7 +1046,7 @@ static void ruvd_decode_bitstream(struct pipe_video_codec *decoder,
|
|||||||
struct rvid_buffer *buf = &dec->bs_buffers[dec->cur_buffer];
|
struct rvid_buffer *buf = &dec->bs_buffers[dec->cur_buffer];
|
||||||
unsigned new_size = dec->bs_size + sizes[i];
|
unsigned new_size = dec->bs_size + sizes[i];
|
||||||
|
|
||||||
if (new_size > buf->res->buf->base.size) {
|
if (new_size > buf->res->buf->size) {
|
||||||
dec->ws->buffer_unmap(dec->ws, buf->res->buf);
|
dec->ws->buffer_unmap(dec->ws, buf->res->buf);
|
||||||
if (!si_vid_resize_buffer(dec->screen, &dec->cs, buf, new_size, NULL)) {
|
if (!si_vid_resize_buffer(dec->screen, &dec->cs, buf, new_size, NULL)) {
|
||||||
RVID_ERR("Can't resize bitstream buffer!");
|
RVID_ERR("Can't resize bitstream buffer!");
|
||||||
@@ -1074,7 +1074,7 @@ static void ruvd_end_frame(struct pipe_video_codec *decoder, struct pipe_video_b
|
|||||||
struct pipe_picture_desc *picture)
|
struct pipe_picture_desc *picture)
|
||||||
{
|
{
|
||||||
struct ruvd_decoder *dec = (struct ruvd_decoder *)decoder;
|
struct ruvd_decoder *dec = (struct ruvd_decoder *)decoder;
|
||||||
struct pb_buffer *dt;
|
struct pb_buffer_lean *dt;
|
||||||
struct rvid_buffer *msg_fb_it_buf, *bs_buf;
|
struct rvid_buffer *msg_fb_it_buf, *bs_buf;
|
||||||
unsigned bs_size;
|
unsigned bs_size;
|
||||||
|
|
||||||
@@ -1110,13 +1110,13 @@ static void ruvd_end_frame(struct pipe_video_codec *decoder, struct pipe_video_b
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (dec->dpb.res)
|
if (dec->dpb.res)
|
||||||
dec->msg->body.decode.dpb_size = dec->dpb.res->buf->base.size;
|
dec->msg->body.decode.dpb_size = dec->dpb.res->buf->size;
|
||||||
dec->msg->body.decode.bsd_size = bs_size;
|
dec->msg->body.decode.bsd_size = bs_size;
|
||||||
dec->msg->body.decode.db_pitch = align(dec->base.width, get_db_pitch_alignment(dec));
|
dec->msg->body.decode.db_pitch = align(dec->base.width, get_db_pitch_alignment(dec));
|
||||||
|
|
||||||
if (dec->stream_type == RUVD_CODEC_H264_PERF &&
|
if (dec->stream_type == RUVD_CODEC_H264_PERF &&
|
||||||
((struct si_screen *)dec->screen)->info.family >= CHIP_POLARIS10)
|
((struct si_screen *)dec->screen)->info.family >= CHIP_POLARIS10)
|
||||||
dec->msg->body.decode.dpb_reserved = dec->ctx.res->buf->base.size;
|
dec->msg->body.decode.dpb_reserved = dec->ctx.res->buf->size;
|
||||||
|
|
||||||
dt = dec->set_dtb(dec->msg, (struct vl_video_buffer *)target);
|
dt = dec->set_dtb(dec->msg, (struct vl_video_buffer *)target);
|
||||||
if (((struct si_screen *)dec->screen)->info.family >= CHIP_STONEY)
|
if (((struct si_screen *)dec->screen)->info.family >= CHIP_STONEY)
|
||||||
@@ -1144,7 +1144,7 @@ static void ruvd_end_frame(struct pipe_video_codec *decoder, struct pipe_video_b
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (dec->ctx.res)
|
if (dec->ctx.res)
|
||||||
dec->msg->body.decode.dpb_reserved = dec->ctx.res->buf->base.size;
|
dec->msg->body.decode.dpb_reserved = dec->ctx.res->buf->size;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PIPE_VIDEO_FORMAT_VC1:
|
case PIPE_VIDEO_FORMAT_VC1:
|
||||||
|
|||||||
@@ -15,7 +15,7 @@
|
|||||||
#include "ac_uvd_dec.h"
|
#include "ac_uvd_dec.h"
|
||||||
|
|
||||||
/* driver dependent callback */
|
/* driver dependent callback */
|
||||||
typedef struct pb_buffer *(*ruvd_set_dtb)(struct ruvd_msg *msg, struct vl_video_buffer *vb);
|
typedef struct pb_buffer_lean *(*ruvd_set_dtb)(struct ruvd_msg *msg, struct vl_video_buffer *vb);
|
||||||
|
|
||||||
/* create an UVD decode */
|
/* create an UVD decode */
|
||||||
struct pipe_video_codec *si_common_uvd_create_decoder(struct pipe_context *context,
|
struct pipe_video_codec *si_common_uvd_create_decoder(struct pipe_context *context,
|
||||||
|
|||||||
@@ -328,7 +328,7 @@ typedef struct ruvd_enc_vui_info_s
|
|||||||
uint32_t max_num_reorder_frames;
|
uint32_t max_num_reorder_frames;
|
||||||
} ruvd_enc_vui_info;
|
} ruvd_enc_vui_info;
|
||||||
|
|
||||||
typedef void (*radeon_uvd_enc_get_buffer)(struct pipe_resource *resource, struct pb_buffer **handle,
|
typedef void (*radeon_uvd_enc_get_buffer)(struct pipe_resource *resource, struct pb_buffer_lean **handle,
|
||||||
struct radeon_surf **surface);
|
struct radeon_surf **surface);
|
||||||
|
|
||||||
struct pipe_video_codec *radeon_uvd_create_encoder(struct pipe_context *context,
|
struct pipe_video_codec *radeon_uvd_create_encoder(struct pipe_context *context,
|
||||||
@@ -406,11 +406,11 @@ struct radeon_uvd_encoder {
|
|||||||
|
|
||||||
radeon_uvd_enc_get_buffer get_buffer;
|
radeon_uvd_enc_get_buffer get_buffer;
|
||||||
|
|
||||||
struct pb_buffer *handle;
|
struct pb_buffer_lean *handle;
|
||||||
struct radeon_surf *luma;
|
struct radeon_surf *luma;
|
||||||
struct radeon_surf *chroma;
|
struct radeon_surf *chroma;
|
||||||
|
|
||||||
struct pb_buffer *bs_handle;
|
struct pb_buffer_lean *bs_handle;
|
||||||
unsigned bs_size;
|
unsigned bs_size;
|
||||||
|
|
||||||
unsigned cpb_num;
|
unsigned cpb_num;
|
||||||
|
|||||||
@@ -34,7 +34,7 @@
|
|||||||
|
|
||||||
static const unsigned index_to_shifts[4] = {24, 16, 8, 0};
|
static const unsigned index_to_shifts[4] = {24, 16, 8, 0};
|
||||||
|
|
||||||
static void radeon_uvd_enc_add_buffer(struct radeon_uvd_encoder *enc, struct pb_buffer *buf,
|
static void radeon_uvd_enc_add_buffer(struct radeon_uvd_encoder *enc, struct pb_buffer_lean *buf,
|
||||||
unsigned usage, enum radeon_bo_domain domain,
|
unsigned usage, enum radeon_bo_domain domain,
|
||||||
signed offset)
|
signed offset)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -528,7 +528,7 @@ bool si_vce_is_fw_version_supported(struct si_screen *sscreen)
|
|||||||
/**
|
/**
|
||||||
* Add the buffer as relocation to the current command submission
|
* Add the buffer as relocation to the current command submission
|
||||||
*/
|
*/
|
||||||
void si_vce_add_buffer(struct rvce_encoder *enc, struct pb_buffer *buf, unsigned usage,
|
void si_vce_add_buffer(struct rvce_encoder *enc, struct pb_buffer_lean *buf, unsigned usage,
|
||||||
enum radeon_bo_domain domain, signed offset)
|
enum radeon_bo_domain domain, signed offset)
|
||||||
{
|
{
|
||||||
int reloc_idx;
|
int reloc_idx;
|
||||||
|
|||||||
@@ -33,7 +33,7 @@
|
|||||||
struct si_screen;
|
struct si_screen;
|
||||||
|
|
||||||
/* driver dependent callback */
|
/* driver dependent callback */
|
||||||
typedef void (*rvce_get_buffer)(struct pipe_resource *resource, struct pb_buffer **handle,
|
typedef void (*rvce_get_buffer)(struct pipe_resource *resource, struct pb_buffer_lean **handle,
|
||||||
struct radeon_surf **surface);
|
struct radeon_surf **surface);
|
||||||
|
|
||||||
/* Coded picture buffer slot */
|
/* Coded picture buffer slot */
|
||||||
@@ -374,11 +374,11 @@ struct rvce_encoder {
|
|||||||
|
|
||||||
rvce_get_buffer get_buffer;
|
rvce_get_buffer get_buffer;
|
||||||
|
|
||||||
struct pb_buffer *handle;
|
struct pb_buffer_lean *handle;
|
||||||
struct radeon_surf *luma;
|
struct radeon_surf *luma;
|
||||||
struct radeon_surf *chroma;
|
struct radeon_surf *chroma;
|
||||||
|
|
||||||
struct pb_buffer *bs_handle;
|
struct pb_buffer_lean *bs_handle;
|
||||||
unsigned bs_size;
|
unsigned bs_size;
|
||||||
|
|
||||||
struct rvce_cpb_slot *cpb_array;
|
struct rvce_cpb_slot *cpb_array;
|
||||||
@@ -413,7 +413,7 @@ struct pipe_video_codec *si_vce_create_encoder(struct pipe_context *context,
|
|||||||
|
|
||||||
bool si_vce_is_fw_version_supported(struct si_screen *sscreen);
|
bool si_vce_is_fw_version_supported(struct si_screen *sscreen);
|
||||||
|
|
||||||
void si_vce_add_buffer(struct rvce_encoder *enc, struct pb_buffer *buf, unsigned usage,
|
void si_vce_add_buffer(struct rvce_encoder *enc, struct pb_buffer_lean *buf, unsigned usage,
|
||||||
enum radeon_bo_domain domain, signed offset);
|
enum radeon_bo_domain domain, signed offset);
|
||||||
|
|
||||||
/* init vce fw 40.2.2 specific callbacks */
|
/* init vce fw 40.2.2 specific callbacks */
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ static void encode(struct rvce_encoder *enc)
|
|||||||
|
|
||||||
if (enc->dual_pipe) {
|
if (enc->dual_pipe) {
|
||||||
unsigned aux_offset =
|
unsigned aux_offset =
|
||||||
enc->cpb.res->buf->base.size - RVCE_MAX_AUX_BUFFER_NUM * RVCE_MAX_BITSTREAM_OUTPUT_ROW_SIZE * 2;
|
enc->cpb.res->buf->size - RVCE_MAX_AUX_BUFFER_NUM * RVCE_MAX_BITSTREAM_OUTPUT_ROW_SIZE * 2;
|
||||||
RVCE_BEGIN(0x05000002); // auxiliary buffer
|
RVCE_BEGIN(0x05000002); // auxiliary buffer
|
||||||
for (i = 0; i < 8; ++i) {
|
for (i = 0; i < 8; ++i) {
|
||||||
RVCE_CS(aux_offset);
|
RVCE_CS(aux_offset);
|
||||||
|
|||||||
@@ -226,7 +226,7 @@ static void encode(struct rvce_encoder *enc)
|
|||||||
|
|
||||||
if (enc->dual_pipe) {
|
if (enc->dual_pipe) {
|
||||||
unsigned aux_offset =
|
unsigned aux_offset =
|
||||||
enc->cpb.res->buf->base.size - RVCE_MAX_AUX_BUFFER_NUM * RVCE_MAX_BITSTREAM_OUTPUT_ROW_SIZE * 2;
|
enc->cpb.res->buf->size - RVCE_MAX_AUX_BUFFER_NUM * RVCE_MAX_BITSTREAM_OUTPUT_ROW_SIZE * 2;
|
||||||
RVCE_BEGIN(0x05000002); // auxiliary buffer
|
RVCE_BEGIN(0x05000002); // auxiliary buffer
|
||||||
for (i = 0; i < 8; ++i) {
|
for (i = 0; i < 8; ++i) {
|
||||||
RVCE_CS(aux_offset);
|
RVCE_CS(aux_offset);
|
||||||
|
|||||||
@@ -1912,9 +1912,9 @@ static unsigned rvcn_dec_dynamic_dpb_t2_message(struct radeon_decoder *dec, rvcn
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pb_buffer *rvcn_dec_message_decode(struct radeon_decoder *dec,
|
static struct pb_buffer_lean *rvcn_dec_message_decode(struct radeon_decoder *dec,
|
||||||
struct pipe_video_buffer *target,
|
struct pipe_video_buffer *target,
|
||||||
struct pipe_picture_desc *picture)
|
struct pipe_picture_desc *picture)
|
||||||
{
|
{
|
||||||
DECRYPT_PARAMETERS *decrypt = (DECRYPT_PARAMETERS *)picture->decrypt_key;
|
DECRYPT_PARAMETERS *decrypt = (DECRYPT_PARAMETERS *)picture->decrypt_key;
|
||||||
bool encrypted = picture->protected_playback;
|
bool encrypted = picture->protected_playback;
|
||||||
@@ -2164,14 +2164,14 @@ static struct pb_buffer *rvcn_dec_message_decode(struct radeon_decoder *dec,
|
|||||||
luma = (struct si_texture *)((struct vl_video_buffer *)out_surf)->resources[0];
|
luma = (struct si_texture *)((struct vl_video_buffer *)out_surf)->resources[0];
|
||||||
chroma = (struct si_texture *)((struct vl_video_buffer *)out_surf)->resources[1];
|
chroma = (struct si_texture *)((struct vl_video_buffer *)out_surf)->resources[1];
|
||||||
|
|
||||||
decode->dpb_size = (dec->dpb_type != DPB_DYNAMIC_TIER_2) ? dec->dpb.res->buf->base.size : 0;
|
decode->dpb_size = (dec->dpb_type != DPB_DYNAMIC_TIER_2) ? dec->dpb.res->buf->size : 0;
|
||||||
|
|
||||||
/* When texture being created, the bo will be created with total size of planes,
|
/* When texture being created, the bo will be created with total size of planes,
|
||||||
* and all planes point to the same buffer */
|
* and all planes point to the same buffer */
|
||||||
assert(si_resource(((struct vl_video_buffer *)out_surf)->resources[0])->buf->base.size ==
|
assert(si_resource(((struct vl_video_buffer *)out_surf)->resources[0])->buf->size ==
|
||||||
si_resource(((struct vl_video_buffer *)out_surf)->resources[1])->buf->base.size);
|
si_resource(((struct vl_video_buffer *)out_surf)->resources[1])->buf->size);
|
||||||
|
|
||||||
decode->dt_size = si_resource(((struct vl_video_buffer *)out_surf)->resources[0])->buf->base.size;
|
decode->dt_size = si_resource(((struct vl_video_buffer *)out_surf)->resources[0])->buf->size;
|
||||||
|
|
||||||
decode->sct_size = 0;
|
decode->sct_size = 0;
|
||||||
decode->sc_coeff_size = 0;
|
decode->sc_coeff_size = 0;
|
||||||
@@ -2364,7 +2364,7 @@ static struct pb_buffer *rvcn_dec_message_decode(struct radeon_decoder *dec,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (dec->ctx.res)
|
if (dec->ctx.res)
|
||||||
decode->hw_ctxt_size = dec->ctx.res->buf->base.size;
|
decode->hw_ctxt_size = dec->ctx.res->buf->size;
|
||||||
|
|
||||||
if (dec->dpb_type == DPB_DYNAMIC_TIER_2)
|
if (dec->dpb_type == DPB_DYNAMIC_TIER_2)
|
||||||
if (rvcn_dec_dynamic_dpb_t2_message(dec, decode, dynamic_dpb_t2, encrypted))
|
if (rvcn_dec_dynamic_dpb_t2_message(dec, decode, dynamic_dpb_t2, encrypted))
|
||||||
@@ -2418,7 +2418,7 @@ static void set_reg(struct radeon_decoder *dec, unsigned reg, uint32_t val)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* send a command to the VCPU through the GPCOM registers */
|
/* send a command to the VCPU through the GPCOM registers */
|
||||||
static void send_cmd(struct radeon_decoder *dec, unsigned cmd, struct pb_buffer *buf, uint32_t off,
|
static void send_cmd(struct radeon_decoder *dec, unsigned cmd, struct pb_buffer_lean *buf, uint32_t off,
|
||||||
unsigned usage, enum radeon_bo_domain domain)
|
unsigned usage, enum radeon_bo_domain domain)
|
||||||
{
|
{
|
||||||
uint64_t addr;
|
uint64_t addr;
|
||||||
@@ -2586,35 +2586,35 @@ static unsigned calc_ctx_size_h264_perf(struct radeon_decoder *dec)
|
|||||||
height_in_mb = align(height / VL_MACROBLOCK_HEIGHT, 2);
|
height_in_mb = align(height / VL_MACROBLOCK_HEIGHT, 2);
|
||||||
|
|
||||||
unsigned fs_in_mb = width_in_mb * height_in_mb;
|
unsigned fs_in_mb = width_in_mb * height_in_mb;
|
||||||
unsigned num_dpb_buffer;
|
unsigned num_dpb_buffer_lean;
|
||||||
switch (dec->base.level) {
|
switch (dec->base.level) {
|
||||||
case 30:
|
case 30:
|
||||||
num_dpb_buffer = 8100 / fs_in_mb;
|
num_dpb_buffer_lean = 8100 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 31:
|
case 31:
|
||||||
num_dpb_buffer = 18000 / fs_in_mb;
|
num_dpb_buffer_lean = 18000 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 32:
|
case 32:
|
||||||
num_dpb_buffer = 20480 / fs_in_mb;
|
num_dpb_buffer_lean = 20480 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 41:
|
case 41:
|
||||||
num_dpb_buffer = 32768 / fs_in_mb;
|
num_dpb_buffer_lean = 32768 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 42:
|
case 42:
|
||||||
num_dpb_buffer = 34816 / fs_in_mb;
|
num_dpb_buffer_lean = 34816 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 50:
|
case 50:
|
||||||
num_dpb_buffer = 110400 / fs_in_mb;
|
num_dpb_buffer_lean = 110400 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 51:
|
case 51:
|
||||||
num_dpb_buffer = 184320 / fs_in_mb;
|
num_dpb_buffer_lean = 184320 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
num_dpb_buffer = 184320 / fs_in_mb;
|
num_dpb_buffer_lean = 184320 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
num_dpb_buffer++;
|
num_dpb_buffer_lean++;
|
||||||
max_references = MAX2(MIN2(NUM_H264_REFS, num_dpb_buffer), max_references);
|
max_references = MAX2(MIN2(NUM_H264_REFS, num_dpb_buffer_lean), max_references);
|
||||||
ctx_size = max_references * align(width_in_mb * height_in_mb * 192, 256);
|
ctx_size = max_references * align(width_in_mb * height_in_mb * 192, 256);
|
||||||
|
|
||||||
return ctx_size;
|
return ctx_size;
|
||||||
@@ -2644,36 +2644,36 @@ static unsigned calc_dpb_size(struct radeon_decoder *dec)
|
|||||||
switch (u_reduce_video_profile(dec->base.profile)) {
|
switch (u_reduce_video_profile(dec->base.profile)) {
|
||||||
case PIPE_VIDEO_FORMAT_MPEG4_AVC: {
|
case PIPE_VIDEO_FORMAT_MPEG4_AVC: {
|
||||||
unsigned fs_in_mb = width_in_mb * height_in_mb;
|
unsigned fs_in_mb = width_in_mb * height_in_mb;
|
||||||
unsigned num_dpb_buffer;
|
unsigned num_dpb_buffer_lean;
|
||||||
|
|
||||||
switch (dec->base.level) {
|
switch (dec->base.level) {
|
||||||
case 30:
|
case 30:
|
||||||
num_dpb_buffer = 8100 / fs_in_mb;
|
num_dpb_buffer_lean = 8100 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 31:
|
case 31:
|
||||||
num_dpb_buffer = 18000 / fs_in_mb;
|
num_dpb_buffer_lean = 18000 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 32:
|
case 32:
|
||||||
num_dpb_buffer = 20480 / fs_in_mb;
|
num_dpb_buffer_lean = 20480 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 41:
|
case 41:
|
||||||
num_dpb_buffer = 32768 / fs_in_mb;
|
num_dpb_buffer_lean = 32768 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 42:
|
case 42:
|
||||||
num_dpb_buffer = 34816 / fs_in_mb;
|
num_dpb_buffer_lean = 34816 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 50:
|
case 50:
|
||||||
num_dpb_buffer = 110400 / fs_in_mb;
|
num_dpb_buffer_lean = 110400 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
case 51:
|
case 51:
|
||||||
num_dpb_buffer = 184320 / fs_in_mb;
|
num_dpb_buffer_lean = 184320 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
num_dpb_buffer = 184320 / fs_in_mb;
|
num_dpb_buffer_lean = 184320 / fs_in_mb;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
num_dpb_buffer++;
|
num_dpb_buffer_lean++;
|
||||||
max_references = MAX2(MIN2(NUM_H264_REFS, num_dpb_buffer), max_references);
|
max_references = MAX2(MIN2(NUM_H264_REFS, num_dpb_buffer_lean), max_references);
|
||||||
dpb_size = image_size * max_references;
|
dpb_size = image_size * max_references;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -2882,7 +2882,7 @@ static void radeon_dec_decode_bitstream(struct pipe_video_codec *decoder,
|
|||||||
|
|
||||||
struct rvid_buffer *buf = &dec->bs_buffers[dec->cur_buffer];
|
struct rvid_buffer *buf = &dec->bs_buffers[dec->cur_buffer];
|
||||||
|
|
||||||
if (total_bs_size > buf->res->buf->base.size) {
|
if (total_bs_size > buf->res->buf->size) {
|
||||||
dec->ws->buffer_unmap(dec->ws, buf->res->buf);
|
dec->ws->buffer_unmap(dec->ws, buf->res->buf);
|
||||||
dec->bs_ptr = NULL;
|
dec->bs_ptr = NULL;
|
||||||
if (!si_vid_resize_buffer(dec->screen, &dec->cs, buf, total_bs_size, NULL)) {
|
if (!si_vid_resize_buffer(dec->screen, &dec->cs, buf, total_bs_size, NULL)) {
|
||||||
@@ -2911,7 +2911,7 @@ static void radeon_dec_decode_bitstream(struct pipe_video_codec *decoder,
|
|||||||
void send_cmd_dec(struct radeon_decoder *dec, struct pipe_video_buffer *target,
|
void send_cmd_dec(struct radeon_decoder *dec, struct pipe_video_buffer *target,
|
||||||
struct pipe_picture_desc *picture)
|
struct pipe_picture_desc *picture)
|
||||||
{
|
{
|
||||||
struct pb_buffer *dt;
|
struct pb_buffer_lean *dt;
|
||||||
struct rvid_buffer *msg_fb_it_probs_buf, *bs_buf;
|
struct rvid_buffer *msg_fb_it_probs_buf, *bs_buf;
|
||||||
|
|
||||||
msg_fb_it_probs_buf = &dec->msg_fb_it_probs_buffers[dec->cur_buffer];
|
msg_fb_it_probs_buf = &dec->msg_fb_it_probs_buffers[dec->cur_buffer];
|
||||||
|
|||||||
@@ -16,9 +16,9 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
static struct pb_buffer *radeon_jpeg_get_decode_param(struct radeon_decoder *dec,
|
static struct pb_buffer_lean *radeon_jpeg_get_decode_param(struct radeon_decoder *dec,
|
||||||
struct pipe_video_buffer *target,
|
struct pipe_video_buffer *target,
|
||||||
struct pipe_picture_desc *picture)
|
struct pipe_picture_desc *picture)
|
||||||
{
|
{
|
||||||
struct si_texture *luma = (struct si_texture *)((struct vl_video_buffer *)target)->resources[0];
|
struct si_texture *luma = (struct si_texture *)((struct vl_video_buffer *)target)->resources[0];
|
||||||
struct si_texture *chroma, *chromav;
|
struct si_texture *chroma, *chromav;
|
||||||
@@ -62,7 +62,7 @@ static void set_reg_jpeg(struct radeon_decoder *dec, unsigned reg, unsigned cond
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* send a bitstream buffer command */
|
/* send a bitstream buffer command */
|
||||||
static void send_cmd_bitstream(struct radeon_decoder *dec, struct pb_buffer *buf, uint32_t off,
|
static void send_cmd_bitstream(struct radeon_decoder *dec, struct pb_buffer_lean *buf, uint32_t off,
|
||||||
unsigned usage, enum radeon_bo_domain domain)
|
unsigned usage, enum radeon_bo_domain domain)
|
||||||
{
|
{
|
||||||
uint64_t addr;
|
uint64_t addr;
|
||||||
@@ -105,7 +105,7 @@ static void send_cmd_bitstream(struct radeon_decoder *dec, struct pb_buffer *buf
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* send a target buffer command */
|
/* send a target buffer command */
|
||||||
static void send_cmd_target(struct radeon_decoder *dec, struct pb_buffer *buf, uint32_t off,
|
static void send_cmd_target(struct radeon_decoder *dec, struct pb_buffer_lean *buf, uint32_t off,
|
||||||
unsigned usage, enum radeon_bo_domain domain)
|
unsigned usage, enum radeon_bo_domain domain)
|
||||||
{
|
{
|
||||||
uint64_t addr;
|
uint64_t addr;
|
||||||
@@ -184,7 +184,7 @@ static void send_cmd_target(struct radeon_decoder *dec, struct pb_buffer *buf, u
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* send a bitstream buffer command */
|
/* send a bitstream buffer command */
|
||||||
static void send_cmd_bitstream_direct(struct radeon_decoder *dec, struct pb_buffer *buf,
|
static void send_cmd_bitstream_direct(struct radeon_decoder *dec, struct pb_buffer_lean *buf,
|
||||||
uint32_t off, unsigned usage,
|
uint32_t off, unsigned usage,
|
||||||
enum radeon_bo_domain domain)
|
enum radeon_bo_domain domain)
|
||||||
{
|
{
|
||||||
@@ -224,7 +224,7 @@ static void send_cmd_bitstream_direct(struct radeon_decoder *dec, struct pb_buff
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* send a target buffer command */
|
/* send a target buffer command */
|
||||||
static void send_cmd_target_direct(struct radeon_decoder *dec, struct pb_buffer *buf, uint32_t off,
|
static void send_cmd_target_direct(struct radeon_decoder *dec, struct pb_buffer_lean *buf, uint32_t off,
|
||||||
unsigned usage, enum radeon_bo_domain domain,
|
unsigned usage, enum radeon_bo_domain domain,
|
||||||
enum pipe_format buffer_format)
|
enum pipe_format buffer_format)
|
||||||
{
|
{
|
||||||
@@ -360,7 +360,7 @@ static void send_cmd_target_direct(struct radeon_decoder *dec, struct pb_buffer
|
|||||||
void send_cmd_jpeg(struct radeon_decoder *dec, struct pipe_video_buffer *target,
|
void send_cmd_jpeg(struct radeon_decoder *dec, struct pipe_video_buffer *target,
|
||||||
struct pipe_picture_desc *picture)
|
struct pipe_picture_desc *picture)
|
||||||
{
|
{
|
||||||
struct pb_buffer *dt;
|
struct pb_buffer_lean *dt;
|
||||||
struct rvid_buffer *bs_buf;
|
struct rvid_buffer *bs_buf;
|
||||||
|
|
||||||
bs_buf = &dec->bs_buffers[dec->cur_buffer];
|
bs_buf = &dec->bs_buffers[dec->cur_buffer];
|
||||||
|
|||||||
@@ -1160,7 +1160,7 @@ static void radeon_enc_encode_bitstream(struct pipe_video_codec *encoder,
|
|||||||
|
|
||||||
if (vid_buf->base.statistics_data) {
|
if (vid_buf->base.statistics_data) {
|
||||||
enc->get_buffer(vid_buf->base.statistics_data, &enc->stats, NULL);
|
enc->get_buffer(vid_buf->base.statistics_data, &enc->stats, NULL);
|
||||||
if (enc->stats->base.size < sizeof(rvcn_encode_stats_type_0_t)) {
|
if (enc->stats->size < sizeof(rvcn_encode_stats_type_0_t)) {
|
||||||
RVID_ERR("Encoder statistics output buffer is too small.\n");
|
RVID_ERR("Encoder statistics output buffer is too small.\n");
|
||||||
enc->stats = NULL;
|
enc->stats = NULL;
|
||||||
}
|
}
|
||||||
@@ -1291,7 +1291,7 @@ error:
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void radeon_enc_add_buffer(struct radeon_encoder *enc, struct pb_buffer *buf,
|
void radeon_enc_add_buffer(struct radeon_encoder *enc, struct pb_buffer_lean *buf,
|
||||||
unsigned usage, enum radeon_bo_domain domain, signed offset)
|
unsigned usage, enum radeon_bo_domain domain, signed offset)
|
||||||
{
|
{
|
||||||
enc->ws->cs_add_buffer(&enc->cs, buf, usage | RADEON_USAGE_SYNCHRONIZED, domain);
|
enc->ws->cs_add_buffer(&enc->cs, buf, usage | RADEON_USAGE_SYNCHRONIZED, domain);
|
||||||
|
|||||||
@@ -49,7 +49,7 @@
|
|||||||
} \
|
} \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
typedef void (*radeon_enc_get_buffer)(struct pipe_resource *resource, struct pb_buffer **handle,
|
typedef void (*radeon_enc_get_buffer)(struct pipe_resource *resource, struct pb_buffer_lean **handle,
|
||||||
struct radeon_surf **surface);
|
struct radeon_surf **surface);
|
||||||
|
|
||||||
struct pipe_video_codec *radeon_create_encoder(struct pipe_context *context,
|
struct pipe_video_codec *radeon_create_encoder(struct pipe_context *context,
|
||||||
@@ -233,11 +233,11 @@ struct radeon_encoder {
|
|||||||
|
|
||||||
radeon_enc_get_buffer get_buffer;
|
radeon_enc_get_buffer get_buffer;
|
||||||
|
|
||||||
struct pb_buffer *handle;
|
struct pb_buffer_lean *handle;
|
||||||
struct radeon_surf *luma;
|
struct radeon_surf *luma;
|
||||||
struct radeon_surf *chroma;
|
struct radeon_surf *chroma;
|
||||||
|
|
||||||
struct pb_buffer *bs_handle;
|
struct pb_buffer_lean *bs_handle;
|
||||||
unsigned bs_size;
|
unsigned bs_size;
|
||||||
|
|
||||||
struct rvid_buffer *si;
|
struct rvid_buffer *si;
|
||||||
@@ -246,7 +246,7 @@ struct radeon_encoder {
|
|||||||
struct rvid_buffer *cdf;
|
struct rvid_buffer *cdf;
|
||||||
struct rvid_buffer *roi;
|
struct rvid_buffer *roi;
|
||||||
struct radeon_enc_pic enc_pic;
|
struct radeon_enc_pic enc_pic;
|
||||||
struct pb_buffer *stats;
|
struct pb_buffer_lean *stats;
|
||||||
rvcn_enc_cmd_t cmd;
|
rvcn_enc_cmd_t cmd;
|
||||||
|
|
||||||
unsigned alignment;
|
unsigned alignment;
|
||||||
@@ -270,7 +270,7 @@ struct radeon_encoder {
|
|||||||
struct pipe_context *ectx;
|
struct pipe_context *ectx;
|
||||||
};
|
};
|
||||||
|
|
||||||
void radeon_enc_add_buffer(struct radeon_encoder *enc, struct pb_buffer *buf,
|
void radeon_enc_add_buffer(struct radeon_encoder *enc, struct pb_buffer_lean *buf,
|
||||||
unsigned usage, enum radeon_bo_domain domain, signed offset);
|
unsigned usage, enum radeon_bo_domain domain, signed offset);
|
||||||
|
|
||||||
void radeon_enc_dummy(struct radeon_encoder *enc);
|
void radeon_enc_dummy(struct radeon_encoder *enc);
|
||||||
|
|||||||
@@ -73,7 +73,7 @@ bool si_vid_resize_buffer(struct pipe_screen *screen, struct radeon_cmdbuf *cs,
|
|||||||
{
|
{
|
||||||
struct si_screen *sscreen = (struct si_screen *)screen;
|
struct si_screen *sscreen = (struct si_screen *)screen;
|
||||||
struct radeon_winsys *ws = sscreen->ws;
|
struct radeon_winsys *ws = sscreen->ws;
|
||||||
unsigned bytes = MIN2(new_buf->res->buf->base.size, new_size);
|
unsigned bytes = MIN2(new_buf->res->buf->size, new_size);
|
||||||
struct rvid_buffer old_buf = *new_buf;
|
struct rvid_buffer old_buf = *new_buf;
|
||||||
void *src = NULL, *dst = NULL;
|
void *src = NULL, *dst = NULL;
|
||||||
|
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
bool si_cs_is_buffer_referenced(struct si_context *sctx, struct pb_buffer *buf,
|
bool si_cs_is_buffer_referenced(struct si_context *sctx, struct pb_buffer_lean *buf,
|
||||||
unsigned usage)
|
unsigned usage)
|
||||||
{
|
{
|
||||||
return sctx->ws->cs_is_buffer_referenced(&sctx->gfx_cs, buf, usage);
|
return sctx->ws->cs_is_buffer_referenced(&sctx->gfx_cs, buf, usage);
|
||||||
@@ -144,7 +144,7 @@ void si_init_resource_fields(struct si_screen *sscreen, struct si_resource *res,
|
|||||||
|
|
||||||
bool si_alloc_resource(struct si_screen *sscreen, struct si_resource *res)
|
bool si_alloc_resource(struct si_screen *sscreen, struct si_resource *res)
|
||||||
{
|
{
|
||||||
struct pb_buffer *old_buf, *new_buf;
|
struct pb_buffer_lean *old_buf, *new_buf;
|
||||||
|
|
||||||
/* Allocate a new resource. */
|
/* Allocate a new resource. */
|
||||||
new_buf = sscreen->ws->buffer_create(sscreen->ws, res->bo_size, 1 << res->bo_alignment_log2,
|
new_buf = sscreen->ws->buffer_create(sscreen->ws, res->bo_size, 1 << res->bo_alignment_log2,
|
||||||
@@ -179,7 +179,7 @@ bool si_alloc_resource(struct si_screen *sscreen, struct si_resource *res)
|
|||||||
/* Print debug information. */
|
/* Print debug information. */
|
||||||
if (sscreen->debug_flags & DBG(VM) && res->b.b.target == PIPE_BUFFER) {
|
if (sscreen->debug_flags & DBG(VM) && res->b.b.target == PIPE_BUFFER) {
|
||||||
fprintf(stderr, "VM start=0x%" PRIX64 " end=0x%" PRIX64 " | Buffer %" PRIu64 " bytes | Flags: ",
|
fprintf(stderr, "VM start=0x%" PRIX64 " end=0x%" PRIX64 " | Buffer %" PRIu64 " bytes | Flags: ",
|
||||||
res->gpu_address, res->gpu_address + res->buf->base.size, res->buf->base.size);
|
res->gpu_address, res->gpu_address + res->buf->size, res->buf->size);
|
||||||
si_res_print_flags(res->flags);
|
si_res_print_flags(res->flags);
|
||||||
fprintf(stderr, "\n");
|
fprintf(stderr, "\n");
|
||||||
}
|
}
|
||||||
@@ -640,10 +640,10 @@ static struct pipe_resource *si_buffer_from_user_memory(struct pipe_screen *scre
|
|||||||
|
|
||||||
struct pipe_resource *si_buffer_from_winsys_buffer(struct pipe_screen *screen,
|
struct pipe_resource *si_buffer_from_winsys_buffer(struct pipe_screen *screen,
|
||||||
const struct pipe_resource *templ,
|
const struct pipe_resource *templ,
|
||||||
struct pb_buffer *imported_buf,
|
struct pb_buffer_lean *imported_buf,
|
||||||
uint64_t offset)
|
uint64_t offset)
|
||||||
{
|
{
|
||||||
if (offset + templ->width0 > imported_buf->base.size)
|
if (offset + templ->width0 > imported_buf->size)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
struct si_screen *sscreen = (struct si_screen *)screen;
|
struct si_screen *sscreen = (struct si_screen *)screen;
|
||||||
@@ -679,8 +679,8 @@ struct pipe_resource *si_buffer_from_winsys_buffer(struct pipe_screen *screen,
|
|||||||
res->b.b.usage = PIPE_USAGE_STAGING;
|
res->b.b.usage = PIPE_USAGE_STAGING;
|
||||||
}
|
}
|
||||||
|
|
||||||
si_init_resource_fields(sscreen, res, imported_buf->base.size,
|
si_init_resource_fields(sscreen, res, imported_buf->size,
|
||||||
1 << imported_buf->base.alignment_log2);
|
1 << imported_buf->alignment_log2);
|
||||||
|
|
||||||
res->b.is_shared = true;
|
res->b.is_shared = true;
|
||||||
res->b.buffer_id_unique = util_idalloc_mt_alloc(&sscreen->buffer_ids);
|
res->b.buffer_id_unique = util_idalloc_mt_alloc(&sscreen->buffer_ids);
|
||||||
|
|||||||
@@ -899,7 +899,7 @@ si_spm_init(struct si_context *sctx)
|
|||||||
void
|
void
|
||||||
si_spm_finish(struct si_context *sctx)
|
si_spm_finish(struct si_context *sctx)
|
||||||
{
|
{
|
||||||
struct pb_buffer *bo = sctx->spm.bo;
|
struct pb_buffer_lean *bo = sctx->spm.bo;
|
||||||
radeon_bo_reference(sctx->screen->ws, &bo, NULL);
|
radeon_bo_reference(sctx->screen->ws, &bo, NULL);
|
||||||
|
|
||||||
ac_destroy_spm(&sctx->spm);
|
ac_destroy_spm(&sctx->spm);
|
||||||
|
|||||||
@@ -1087,7 +1087,7 @@ static void si_test_gds_memory_management(struct si_context *sctx, unsigned allo
|
|||||||
{
|
{
|
||||||
struct radeon_winsys *ws = sctx->ws;
|
struct radeon_winsys *ws = sctx->ws;
|
||||||
struct radeon_cmdbuf cs[8];
|
struct radeon_cmdbuf cs[8];
|
||||||
struct pb_buffer *gds_bo[ARRAY_SIZE(cs)];
|
struct pb_buffer_lean *gds_bo[ARRAY_SIZE(cs)];
|
||||||
|
|
||||||
for (unsigned i = 0; i < ARRAY_SIZE(cs); i++) {
|
for (unsigned i = 0; i < ARRAY_SIZE(cs); i++) {
|
||||||
ws->cs_create(&cs[i], sctx->ctx, AMD_IP_COMPUTE, NULL, NULL);
|
ws->cs_create(&cs[i], sctx->ctx, AMD_IP_COMPUTE, NULL, NULL);
|
||||||
|
|||||||
@@ -322,7 +322,7 @@ struct si_resource {
|
|||||||
uint32_t _pad;
|
uint32_t _pad;
|
||||||
|
|
||||||
/* Winsys objects. */
|
/* Winsys objects. */
|
||||||
struct pb_buffer *buf;
|
struct pb_buffer_lean *buf;
|
||||||
uint64_t gpu_address;
|
uint64_t gpu_address;
|
||||||
|
|
||||||
/* Resource properties. */
|
/* Resource properties. */
|
||||||
@@ -438,7 +438,7 @@ struct si_texture {
|
|||||||
*/
|
*/
|
||||||
struct si_auxiliary_texture {
|
struct si_auxiliary_texture {
|
||||||
struct threaded_resource b;
|
struct threaded_resource b;
|
||||||
struct pb_buffer *buffer;
|
struct pb_buffer_lean *buffer;
|
||||||
uint32_t offset;
|
uint32_t offset;
|
||||||
uint32_t stride;
|
uint32_t stride;
|
||||||
};
|
};
|
||||||
@@ -529,7 +529,7 @@ union si_mmio_counters {
|
|||||||
|
|
||||||
struct si_memory_object {
|
struct si_memory_object {
|
||||||
struct pipe_memory_object b;
|
struct pipe_memory_object b;
|
||||||
struct pb_buffer *buf;
|
struct pb_buffer_lean *buf;
|
||||||
uint32_t stride;
|
uint32_t stride;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -715,7 +715,7 @@ struct si_screen {
|
|||||||
|
|
||||||
/* NGG streamout. */
|
/* NGG streamout. */
|
||||||
simple_mtx_t gds_mutex;
|
simple_mtx_t gds_mutex;
|
||||||
struct pb_buffer *gds_oa;
|
struct pb_buffer_lean *gds_oa;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct si_compute {
|
struct si_compute {
|
||||||
@@ -1420,7 +1420,7 @@ void si_gfx_blit(struct pipe_context *ctx, const struct pipe_blit_info *info);
|
|||||||
bool si_nir_is_output_const_if_tex_is_const(struct nir_shader *shader, float *in, float *out, int *texunit);
|
bool si_nir_is_output_const_if_tex_is_const(struct nir_shader *shader, float *in, float *out, int *texunit);
|
||||||
|
|
||||||
/* si_buffer.c */
|
/* si_buffer.c */
|
||||||
bool si_cs_is_buffer_referenced(struct si_context *sctx, struct pb_buffer *buf,
|
bool si_cs_is_buffer_referenced(struct si_context *sctx, struct pb_buffer_lean *buf,
|
||||||
unsigned usage);
|
unsigned usage);
|
||||||
void *si_buffer_map(struct si_context *sctx, struct si_resource *resource,
|
void *si_buffer_map(struct si_context *sctx, struct si_resource *resource,
|
||||||
unsigned usage);
|
unsigned usage);
|
||||||
@@ -1433,7 +1433,7 @@ struct si_resource *si_aligned_buffer_create(struct pipe_screen *screen, unsigne
|
|||||||
unsigned usage, unsigned size, unsigned alignment);
|
unsigned usage, unsigned size, unsigned alignment);
|
||||||
struct pipe_resource *si_buffer_from_winsys_buffer(struct pipe_screen *screen,
|
struct pipe_resource *si_buffer_from_winsys_buffer(struct pipe_screen *screen,
|
||||||
const struct pipe_resource *templ,
|
const struct pipe_resource *templ,
|
||||||
struct pb_buffer *imported_buf,
|
struct pb_buffer_lean *imported_buf,
|
||||||
uint64_t offset);
|
uint64_t offset);
|
||||||
void si_replace_buffer_storage(struct pipe_context *ctx, struct pipe_resource *dst,
|
void si_replace_buffer_storage(struct pipe_context *ctx, struct pipe_resource *dst,
|
||||||
struct pipe_resource *src, unsigned num_rebinds,
|
struct pipe_resource *src, unsigned num_rebinds,
|
||||||
|
|||||||
@@ -669,7 +669,7 @@ bool si_init_sqtt(struct si_context *sctx)
|
|||||||
void si_destroy_sqtt(struct si_context *sctx)
|
void si_destroy_sqtt(struct si_context *sctx)
|
||||||
{
|
{
|
||||||
struct si_screen *sscreen = sctx->screen;
|
struct si_screen *sscreen = sctx->screen;
|
||||||
struct pb_buffer *bo = sctx->sqtt->bo;
|
struct pb_buffer_lean *bo = sctx->sqtt->bo;
|
||||||
radeon_bo_reference(sctx->screen->ws, &bo, NULL);
|
radeon_bo_reference(sctx->screen->ws, &bo, NULL);
|
||||||
|
|
||||||
if (sctx->sqtt->trigger_file)
|
if (sctx->sqtt->trigger_file)
|
||||||
|
|||||||
@@ -949,7 +949,7 @@ static struct si_texture *si_texture_create_object(struct pipe_screen *screen,
|
|||||||
const struct pipe_resource *base,
|
const struct pipe_resource *base,
|
||||||
const struct radeon_surf *surface,
|
const struct radeon_surf *surface,
|
||||||
const struct si_texture *plane0,
|
const struct si_texture *plane0,
|
||||||
struct pb_buffer *imported_buf,
|
struct pb_buffer_lean *imported_buf,
|
||||||
uint64_t offset, unsigned pitch_in_bytes,
|
uint64_t offset, unsigned pitch_in_bytes,
|
||||||
uint64_t alloc_size, unsigned alignment)
|
uint64_t alloc_size, unsigned alignment)
|
||||||
{
|
{
|
||||||
@@ -1007,8 +1007,8 @@ static struct si_texture *si_texture_create_object(struct pipe_screen *screen,
|
|||||||
} else {
|
} else {
|
||||||
resource->buf = imported_buf;
|
resource->buf = imported_buf;
|
||||||
resource->gpu_address = sscreen->ws->buffer_get_virtual_address(resource->buf);
|
resource->gpu_address = sscreen->ws->buffer_get_virtual_address(resource->buf);
|
||||||
resource->bo_size = imported_buf->base.size;
|
resource->bo_size = imported_buf->size;
|
||||||
resource->bo_alignment_log2 = imported_buf->base.alignment_log2;
|
resource->bo_alignment_log2 = imported_buf->alignment_log2;
|
||||||
resource->domains = sscreen->ws->buffer_get_initial_domain(resource->buf);
|
resource->domains = sscreen->ws->buffer_get_initial_domain(resource->buf);
|
||||||
if (sscreen->ws->buffer_get_flags)
|
if (sscreen->ws->buffer_get_flags)
|
||||||
resource->flags = sscreen->ws->buffer_get_flags(resource->buf);
|
resource->flags = sscreen->ws->buffer_get_flags(resource->buf);
|
||||||
@@ -1018,7 +1018,7 @@ static struct si_texture *si_texture_create_object(struct pipe_screen *screen,
|
|||||||
fprintf(stderr,
|
fprintf(stderr,
|
||||||
"VM start=0x%" PRIX64 " end=0x%" PRIX64
|
"VM start=0x%" PRIX64 " end=0x%" PRIX64
|
||||||
" | Texture %ix%ix%i, %i levels, %i samples, %s | Flags: ",
|
" | Texture %ix%ix%i, %i levels, %i samples, %s | Flags: ",
|
||||||
tex->buffer.gpu_address, tex->buffer.gpu_address + tex->buffer.buf->base.size,
|
tex->buffer.gpu_address, tex->buffer.gpu_address + tex->buffer.buf->size,
|
||||||
base->width0, base->height0, util_num_layers(base, 0), base->last_level + 1,
|
base->width0, base->height0, util_num_layers(base, 0), base->last_level + 1,
|
||||||
base->nr_samples ? base->nr_samples : 1, util_format_short_name(base->format));
|
base->nr_samples ? base->nr_samples : 1, util_format_short_name(base->format));
|
||||||
si_res_print_flags(tex->buffer.flags);
|
si_res_print_flags(tex->buffer.flags);
|
||||||
@@ -1580,7 +1580,7 @@ static bool si_texture_is_aux_plane(const struct pipe_resource *resource)
|
|||||||
|
|
||||||
static struct pipe_resource *si_texture_from_winsys_buffer(struct si_screen *sscreen,
|
static struct pipe_resource *si_texture_from_winsys_buffer(struct si_screen *sscreen,
|
||||||
const struct pipe_resource *templ,
|
const struct pipe_resource *templ,
|
||||||
struct pb_buffer *buf, unsigned stride,
|
struct pb_buffer_lean *buf, unsigned stride,
|
||||||
uint64_t offset, uint64_t modifier,
|
uint64_t offset, uint64_t modifier,
|
||||||
unsigned usage, bool dedicated)
|
unsigned usage, bool dedicated)
|
||||||
{
|
{
|
||||||
@@ -1681,7 +1681,7 @@ static struct pipe_resource *si_texture_from_winsys_buffer(struct si_screen *ssc
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (ac_surface_get_plane_offset(sscreen->info.gfx_level, &tex->surface, 0, 0) +
|
if (ac_surface_get_plane_offset(sscreen->info.gfx_level, &tex->surface, 0, 0) +
|
||||||
tex->surface.total_size > buf->base.size) {
|
tex->surface.total_size > buf->size) {
|
||||||
si_texture_reference(&tex, NULL);
|
si_texture_reference(&tex, NULL);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -1705,7 +1705,7 @@ static struct pipe_resource *si_texture_from_handle(struct pipe_screen *screen,
|
|||||||
struct winsys_handle *whandle, unsigned usage)
|
struct winsys_handle *whandle, unsigned usage)
|
||||||
{
|
{
|
||||||
struct si_screen *sscreen = (struct si_screen *)screen;
|
struct si_screen *sscreen = (struct si_screen *)screen;
|
||||||
struct pb_buffer *buf = NULL;
|
struct pb_buffer_lean *buf = NULL;
|
||||||
|
|
||||||
buf = sscreen->ws->buffer_from_handle(sscreen->ws, whandle,
|
buf = sscreen->ws->buffer_from_handle(sscreen->ws, whandle,
|
||||||
sscreen->info.max_alignment,
|
sscreen->info.max_alignment,
|
||||||
@@ -2025,7 +2025,7 @@ static void si_texture_transfer_unmap(struct pipe_context *ctx, struct pipe_tran
|
|||||||
si_copy_from_staging_texture(ctx, stransfer);
|
si_copy_from_staging_texture(ctx, stransfer);
|
||||||
|
|
||||||
if (stransfer->staging) {
|
if (stransfer->staging) {
|
||||||
sctx->num_alloc_tex_transfer_bytes += stransfer->staging->buf->base.size;
|
sctx->num_alloc_tex_transfer_bytes += stransfer->staging->buf->size;
|
||||||
si_resource_reference(&stransfer->staging, NULL);
|
si_resource_reference(&stransfer->staging, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2262,7 +2262,7 @@ si_memobj_from_handle(struct pipe_screen *screen, struct winsys_handle *whandle,
|
|||||||
{
|
{
|
||||||
struct si_screen *sscreen = (struct si_screen *)screen;
|
struct si_screen *sscreen = (struct si_screen *)screen;
|
||||||
struct si_memory_object *memobj = CALLOC_STRUCT(si_memory_object);
|
struct si_memory_object *memobj = CALLOC_STRUCT(si_memory_object);
|
||||||
struct pb_buffer *buf = NULL;
|
struct pb_buffer_lean *buf = NULL;
|
||||||
|
|
||||||
if (!memobj)
|
if (!memobj)
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -2312,7 +2312,7 @@ static struct pipe_resource *si_resource_from_memobj(struct pipe_screen *screen,
|
|||||||
/* si_texture_from_winsys_buffer doesn't increment refcount of
|
/* si_texture_from_winsys_buffer doesn't increment refcount of
|
||||||
* memobj->buf, so increment it here.
|
* memobj->buf, so increment it here.
|
||||||
*/
|
*/
|
||||||
struct pb_buffer *buf = NULL;
|
struct pb_buffer_lean *buf = NULL;
|
||||||
radeon_bo_reference(sscreen->ws, &buf, memobj->buf);
|
radeon_bo_reference(sscreen->ws, &buf, memobj->buf);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ struct pipe_video_buffer *si_video_buffer_create_with_modifiers(struct pipe_cont
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* set the decoding target buffer offsets */
|
/* set the decoding target buffer offsets */
|
||||||
static struct pb_buffer *si_uvd_set_dtb(struct ruvd_msg *msg, struct vl_video_buffer *buf)
|
static struct pb_buffer_lean *si_uvd_set_dtb(struct ruvd_msg *msg, struct vl_video_buffer *buf)
|
||||||
{
|
{
|
||||||
struct si_screen *sscreen = (struct si_screen *)buf->base.context->screen;
|
struct si_screen *sscreen = (struct si_screen *)buf->base.context->screen;
|
||||||
struct si_texture *luma = (struct si_texture *)buf->resources[0];
|
struct si_texture *luma = (struct si_texture *)buf->resources[0];
|
||||||
@@ -85,7 +85,7 @@ static struct pb_buffer *si_uvd_set_dtb(struct ruvd_msg *msg, struct vl_video_bu
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* get the radeon resources for VCE */
|
/* get the radeon resources for VCE */
|
||||||
static void si_vce_get_buffer(struct pipe_resource *resource, struct pb_buffer **handle,
|
static void si_vce_get_buffer(struct pipe_resource *resource, struct pb_buffer_lean **handle,
|
||||||
struct radeon_surf **surface)
|
struct radeon_surf **surface)
|
||||||
{
|
{
|
||||||
struct si_texture *res = (struct si_texture *)resource;
|
struct si_texture *res = (struct si_texture *)resource;
|
||||||
|
|||||||
@@ -334,13 +334,14 @@ struct radeon_winsys {
|
|||||||
* \param domain A bitmask of the RADEON_DOMAIN_* flags.
|
* \param domain A bitmask of the RADEON_DOMAIN_* flags.
|
||||||
* \return The created buffer object.
|
* \return The created buffer object.
|
||||||
*/
|
*/
|
||||||
struct pb_buffer *(*buffer_create)(struct radeon_winsys *ws, uint64_t size, unsigned alignment,
|
struct pb_buffer_lean *(*buffer_create)(struct radeon_winsys *ws, uint64_t size,
|
||||||
enum radeon_bo_domain domain, enum radeon_bo_flag flags);
|
unsigned alignment, enum radeon_bo_domain domain,
|
||||||
|
enum radeon_bo_flag flags);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Don't use directly. Use radeon_bo_reference.
|
* Don't use directly. Use radeon_bo_reference.
|
||||||
*/
|
*/
|
||||||
void (*buffer_destroy)(struct radeon_winsys *ws, struct pb_buffer *buf);
|
void (*buffer_destroy)(struct radeon_winsys *ws, struct pb_buffer_lean *buf);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Map the entire data store of a buffer object into the client's address
|
* Map the entire data store of a buffer object into the client's address
|
||||||
@@ -354,7 +355,7 @@ struct radeon_winsys {
|
|||||||
* \param usage A bitmask of the PIPE_MAP_* and RADEON_MAP_* flags.
|
* \param usage A bitmask of the PIPE_MAP_* and RADEON_MAP_* flags.
|
||||||
* \return The pointer at the beginning of the buffer.
|
* \return The pointer at the beginning of the buffer.
|
||||||
*/
|
*/
|
||||||
void *(*buffer_map)(struct radeon_winsys *ws, struct pb_buffer *buf,
|
void *(*buffer_map)(struct radeon_winsys *ws, struct pb_buffer_lean *buf,
|
||||||
struct radeon_cmdbuf *cs, enum pipe_map_flags usage);
|
struct radeon_cmdbuf *cs, enum pipe_map_flags usage);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -362,7 +363,7 @@ struct radeon_winsys {
|
|||||||
*
|
*
|
||||||
* \param buf A winsys buffer object to unmap.
|
* \param buf A winsys buffer object to unmap.
|
||||||
*/
|
*/
|
||||||
void (*buffer_unmap)(struct radeon_winsys *ws, struct pb_buffer *buf);
|
void (*buffer_unmap)(struct radeon_winsys *ws, struct pb_buffer_lean *buf);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Wait for the buffer and return true if the buffer is not used
|
* Wait for the buffer and return true if the buffer is not used
|
||||||
@@ -372,7 +373,7 @@ struct radeon_winsys {
|
|||||||
* The timeout of OS_TIMEOUT_INFINITE will always wait until the buffer
|
* The timeout of OS_TIMEOUT_INFINITE will always wait until the buffer
|
||||||
* is idle.
|
* is idle.
|
||||||
*/
|
*/
|
||||||
bool (*buffer_wait)(struct radeon_winsys *ws, struct pb_buffer *buf,
|
bool (*buffer_wait)(struct radeon_winsys *ws, struct pb_buffer_lean *buf,
|
||||||
uint64_t timeout, unsigned usage);
|
uint64_t timeout, unsigned usage);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -382,7 +383,7 @@ struct radeon_winsys {
|
|||||||
* \param buf A winsys buffer object to get the flags from.
|
* \param buf A winsys buffer object to get the flags from.
|
||||||
* \param md Metadata
|
* \param md Metadata
|
||||||
*/
|
*/
|
||||||
void (*buffer_get_metadata)(struct radeon_winsys *ws, struct pb_buffer *buf,
|
void (*buffer_get_metadata)(struct radeon_winsys *ws, struct pb_buffer_lean *buf,
|
||||||
struct radeon_bo_metadata *md, struct radeon_surf *surf);
|
struct radeon_bo_metadata *md, struct radeon_surf *surf);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -392,7 +393,7 @@ struct radeon_winsys {
|
|||||||
* \param buf A winsys buffer object to set the flags for.
|
* \param buf A winsys buffer object to set the flags for.
|
||||||
* \param md Metadata
|
* \param md Metadata
|
||||||
*/
|
*/
|
||||||
void (*buffer_set_metadata)(struct radeon_winsys *ws, struct pb_buffer *buf,
|
void (*buffer_set_metadata)(struct radeon_winsys *ws, struct pb_buffer_lean *buf,
|
||||||
struct radeon_bo_metadata *md, struct radeon_surf *surf);
|
struct radeon_bo_metadata *md, struct radeon_surf *surf);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -403,8 +404,10 @@ struct radeon_winsys {
|
|||||||
* \param whandle A winsys handle pointer as was received from a state
|
* \param whandle A winsys handle pointer as was received from a state
|
||||||
* tracker.
|
* tracker.
|
||||||
*/
|
*/
|
||||||
struct pb_buffer *(*buffer_from_handle)(struct radeon_winsys *ws, struct winsys_handle *whandle,
|
struct pb_buffer_lean *(*buffer_from_handle)(struct radeon_winsys *ws,
|
||||||
unsigned vm_alignment, bool is_prime_linear_buffer);
|
struct winsys_handle *whandle,
|
||||||
|
unsigned vm_alignment,
|
||||||
|
bool is_prime_linear_buffer);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a winsys buffer from a user pointer. The resulting buffer can't
|
* Get a winsys buffer from a user pointer. The resulting buffer can't
|
||||||
@@ -414,7 +417,8 @@ struct radeon_winsys {
|
|||||||
* \param pointer User pointer to turn into a buffer object.
|
* \param pointer User pointer to turn into a buffer object.
|
||||||
* \param Size Size in bytes for the new buffer.
|
* \param Size Size in bytes for the new buffer.
|
||||||
*/
|
*/
|
||||||
struct pb_buffer *(*buffer_from_ptr)(struct radeon_winsys *ws, void *pointer, uint64_t size, enum radeon_bo_flag flags);
|
struct pb_buffer_lean *(*buffer_from_ptr)(struct radeon_winsys *ws, void *pointer,
|
||||||
|
uint64_t size, enum radeon_bo_flag flags);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether the buffer was created from a user pointer.
|
* Whether the buffer was created from a user pointer.
|
||||||
@@ -422,10 +426,10 @@ struct radeon_winsys {
|
|||||||
* \param buf A winsys buffer object
|
* \param buf A winsys buffer object
|
||||||
* \return whether \p buf was created via buffer_from_ptr
|
* \return whether \p buf was created via buffer_from_ptr
|
||||||
*/
|
*/
|
||||||
bool (*buffer_is_user_ptr)(struct pb_buffer *buf);
|
bool (*buffer_is_user_ptr)(struct pb_buffer_lean *buf);
|
||||||
|
|
||||||
/** Whether the buffer was suballocated. */
|
/** Whether the buffer was suballocated. */
|
||||||
bool (*buffer_is_suballocated)(struct pb_buffer *buf);
|
bool (*buffer_is_suballocated)(struct pb_buffer_lean *buf);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a winsys handle from a winsys buffer. The internal structure
|
* Get a winsys handle from a winsys buffer. The internal structure
|
||||||
@@ -436,7 +440,7 @@ struct radeon_winsys {
|
|||||||
* \param whandle A winsys handle pointer.
|
* \param whandle A winsys handle pointer.
|
||||||
* \return true on success.
|
* \return true on success.
|
||||||
*/
|
*/
|
||||||
bool (*buffer_get_handle)(struct radeon_winsys *ws, struct pb_buffer *buf,
|
bool (*buffer_get_handle)(struct radeon_winsys *ws, struct pb_buffer_lean *buf,
|
||||||
struct winsys_handle *whandle);
|
struct winsys_handle *whandle);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -449,7 +453,7 @@ struct radeon_winsys {
|
|||||||
*
|
*
|
||||||
* \return false on out of memory or other failure, true on success.
|
* \return false on out of memory or other failure, true on success.
|
||||||
*/
|
*/
|
||||||
bool (*buffer_commit)(struct radeon_winsys *ws, struct pb_buffer *buf,
|
bool (*buffer_commit)(struct radeon_winsys *ws, struct pb_buffer_lean *buf,
|
||||||
uint64_t offset, uint64_t size, bool commit);
|
uint64_t offset, uint64_t size, bool commit);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -457,7 +461,7 @@ struct radeon_winsys {
|
|||||||
* \note Only implemented by the amdgpu winsys.
|
* \note Only implemented by the amdgpu winsys.
|
||||||
* \return the skipped count if the range_offset fall into a hole.
|
* \return the skipped count if the range_offset fall into a hole.
|
||||||
*/
|
*/
|
||||||
unsigned (*buffer_find_next_committed_memory)(struct pb_buffer *buf,
|
unsigned (*buffer_find_next_committed_memory)(struct pb_buffer_lean *buf,
|
||||||
uint64_t range_offset, unsigned *range_size);
|
uint64_t range_offset, unsigned *range_size);
|
||||||
/**
|
/**
|
||||||
* Return the virtual address of a buffer.
|
* Return the virtual address of a buffer.
|
||||||
@@ -468,7 +472,7 @@ struct radeon_winsys {
|
|||||||
* \param buf A winsys buffer object
|
* \param buf A winsys buffer object
|
||||||
* \return virtual address
|
* \return virtual address
|
||||||
*/
|
*/
|
||||||
uint64_t (*buffer_get_virtual_address)(struct pb_buffer *buf);
|
uint64_t (*buffer_get_virtual_address)(struct pb_buffer_lean *buf);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the offset of this buffer relative to the relocation base.
|
* Return the offset of this buffer relative to the relocation base.
|
||||||
@@ -480,12 +484,12 @@ struct radeon_winsys {
|
|||||||
* \param buf A winsys buffer object
|
* \param buf A winsys buffer object
|
||||||
* \return the offset for relocations
|
* \return the offset for relocations
|
||||||
*/
|
*/
|
||||||
unsigned (*buffer_get_reloc_offset)(struct pb_buffer *buf);
|
unsigned (*buffer_get_reloc_offset)(struct pb_buffer_lean *buf);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Query the initial placement of the buffer from the kernel driver.
|
* Query the initial placement of the buffer from the kernel driver.
|
||||||
*/
|
*/
|
||||||
enum radeon_bo_domain (*buffer_get_initial_domain)(struct pb_buffer *buf);
|
enum radeon_bo_domain (*buffer_get_initial_domain)(struct pb_buffer_lean *buf);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Query the flags used for creation of this buffer.
|
* Query the flags used for creation of this buffer.
|
||||||
@@ -493,7 +497,7 @@ struct radeon_winsys {
|
|||||||
* Note that for imported buffer this may be lossy since not all flags
|
* Note that for imported buffer this may be lossy since not all flags
|
||||||
* are passed 1:1.
|
* are passed 1:1.
|
||||||
*/
|
*/
|
||||||
enum radeon_bo_flag (*buffer_get_flags)(struct pb_buffer *buf);
|
enum radeon_bo_flag (*buffer_get_flags)(struct pb_buffer_lean *buf);
|
||||||
|
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* Command submission.
|
* Command submission.
|
||||||
@@ -576,7 +580,7 @@ struct radeon_winsys {
|
|||||||
* \param domain Bitmask of the RADEON_DOMAIN_* flags.
|
* \param domain Bitmask of the RADEON_DOMAIN_* flags.
|
||||||
* \return Buffer index.
|
* \return Buffer index.
|
||||||
*/
|
*/
|
||||||
unsigned (*cs_add_buffer)(struct radeon_cmdbuf *cs, struct pb_buffer *buf,
|
unsigned (*cs_add_buffer)(struct radeon_cmdbuf *cs, struct pb_buffer_lean *buf,
|
||||||
unsigned usage, enum radeon_bo_domain domain);
|
unsigned usage, enum radeon_bo_domain domain);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -589,7 +593,7 @@ struct radeon_winsys {
|
|||||||
* \param buf Buffer
|
* \param buf Buffer
|
||||||
* \return The buffer index, or -1 if the buffer has not been added.
|
* \return The buffer index, or -1 if the buffer has not been added.
|
||||||
*/
|
*/
|
||||||
int (*cs_lookup_buffer)(struct radeon_cmdbuf *cs, struct pb_buffer *buf);
|
int (*cs_lookup_buffer)(struct radeon_cmdbuf *cs, struct pb_buffer_lean *buf);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return true if there is enough memory in VRAM and GTT for the buffers
|
* Return true if there is enough memory in VRAM and GTT for the buffers
|
||||||
@@ -650,7 +654,7 @@ struct radeon_winsys {
|
|||||||
* \param cs A command stream.
|
* \param cs A command stream.
|
||||||
* \param buf A winsys buffer.
|
* \param buf A winsys buffer.
|
||||||
*/
|
*/
|
||||||
bool (*cs_is_buffer_referenced)(struct radeon_cmdbuf *cs, struct pb_buffer *buf,
|
bool (*cs_is_buffer_referenced)(struct radeon_cmdbuf *cs, struct pb_buffer_lean *buf,
|
||||||
unsigned usage);
|
unsigned usage);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -781,11 +785,12 @@ static inline bool radeon_uses_secure_bos(struct radeon_winsys* ws)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
radeon_bo_reference(struct radeon_winsys *rws, struct pb_buffer **dst, struct pb_buffer *src)
|
radeon_bo_reference(struct radeon_winsys *rws, struct pb_buffer_lean **dst,
|
||||||
|
struct pb_buffer_lean *src)
|
||||||
{
|
{
|
||||||
struct pb_buffer *old = *dst;
|
struct pb_buffer_lean *old = *dst;
|
||||||
|
|
||||||
if (pipe_reference(&(*dst)->base.reference, &src->base.reference))
|
if (pipe_reference(&(*dst)->reference, &src->reference))
|
||||||
rws->buffer_destroy(rws, old);
|
rws->buffer_destroy(rws, old);
|
||||||
*dst = src;
|
*dst = src;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ struct amdgpu_sparse_backing_chunk {
|
|||||||
};
|
};
|
||||||
|
|
||||||
static bool amdgpu_bo_wait(struct radeon_winsys *rws,
|
static bool amdgpu_bo_wait(struct radeon_winsys *rws,
|
||||||
struct pb_buffer *_buf, uint64_t timeout,
|
struct pb_buffer_lean *_buf, uint64_t timeout,
|
||||||
unsigned usage)
|
unsigned usage)
|
||||||
{
|
{
|
||||||
struct amdgpu_winsys *ws = amdgpu_winsys(rws);
|
struct amdgpu_winsys *ws = amdgpu_winsys(rws);
|
||||||
@@ -135,15 +135,15 @@ static inline unsigned get_slab_entry_offset(struct amdgpu_winsys_bo *bo)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static enum radeon_bo_domain amdgpu_bo_get_initial_domain(
|
static enum radeon_bo_domain amdgpu_bo_get_initial_domain(
|
||||||
struct pb_buffer *buf)
|
struct pb_buffer_lean *buf)
|
||||||
{
|
{
|
||||||
return ((struct amdgpu_winsys_bo*)buf)->base.base.placement;
|
return ((struct amdgpu_winsys_bo*)buf)->base.placement;
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum radeon_bo_flag amdgpu_bo_get_flags(
|
static enum radeon_bo_flag amdgpu_bo_get_flags(
|
||||||
struct pb_buffer *buf)
|
struct pb_buffer_lean *buf)
|
||||||
{
|
{
|
||||||
return ((struct amdgpu_winsys_bo*)buf)->base.base.usage;
|
return ((struct amdgpu_winsys_bo*)buf)->base.usage;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void amdgpu_bo_remove_fences(struct amdgpu_winsys_bo *bo)
|
static void amdgpu_bo_remove_fences(struct amdgpu_winsys_bo *bo)
|
||||||
@@ -156,7 +156,7 @@ static void amdgpu_bo_remove_fences(struct amdgpu_winsys_bo *bo)
|
|||||||
bo->max_fences = 0;
|
bo->max_fences = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void amdgpu_bo_destroy(struct amdgpu_winsys *ws, struct pb_buffer *_buf)
|
void amdgpu_bo_destroy(struct amdgpu_winsys *ws, struct pb_buffer_lean *_buf)
|
||||||
{
|
{
|
||||||
struct amdgpu_bo_real *bo = get_real_bo(amdgpu_winsys_bo(_buf));
|
struct amdgpu_bo_real *bo = get_real_bo(amdgpu_winsys_bo(_buf));
|
||||||
struct amdgpu_screen_winsys *sws_iter;
|
struct amdgpu_screen_winsys *sws_iter;
|
||||||
@@ -164,15 +164,15 @@ void amdgpu_bo_destroy(struct amdgpu_winsys *ws, struct pb_buffer *_buf)
|
|||||||
simple_mtx_lock(&ws->bo_export_table_lock);
|
simple_mtx_lock(&ws->bo_export_table_lock);
|
||||||
|
|
||||||
/* amdgpu_bo_from_handle might have revived the bo */
|
/* amdgpu_bo_from_handle might have revived the bo */
|
||||||
if (p_atomic_read(&bo->b.base.base.reference.count)) {
|
if (p_atomic_read(&bo->b.base.reference.count)) {
|
||||||
simple_mtx_unlock(&ws->bo_export_table_lock);
|
simple_mtx_unlock(&ws->bo_export_table_lock);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
_mesa_hash_table_remove_key(ws->bo_export_table, bo->bo);
|
_mesa_hash_table_remove_key(ws->bo_export_table, bo->bo);
|
||||||
|
|
||||||
if (bo->b.base.base.placement & RADEON_DOMAIN_VRAM_GTT) {
|
if (bo->b.base.placement & RADEON_DOMAIN_VRAM_GTT) {
|
||||||
amdgpu_bo_va_op(bo->bo, 0, bo->b.base.base.size, bo->gpu_address, 0, AMDGPU_VA_OP_UNMAP);
|
amdgpu_bo_va_op(bo->bo, 0, bo->b.base.size, bo->gpu_address, 0, AMDGPU_VA_OP_UNMAP);
|
||||||
amdgpu_va_range_free(bo->va_handle);
|
amdgpu_va_range_free(bo->va_handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -215,16 +215,16 @@ void amdgpu_bo_destroy(struct amdgpu_winsys *ws, struct pb_buffer *_buf)
|
|||||||
|
|
||||||
amdgpu_bo_remove_fences(&bo->b);
|
amdgpu_bo_remove_fences(&bo->b);
|
||||||
|
|
||||||
if (bo->b.base.base.placement & RADEON_DOMAIN_VRAM)
|
if (bo->b.base.placement & RADEON_DOMAIN_VRAM)
|
||||||
ws->allocated_vram -= align64(bo->b.base.base.size, ws->info.gart_page_size);
|
ws->allocated_vram -= align64(bo->b.base.size, ws->info.gart_page_size);
|
||||||
else if (bo->b.base.base.placement & RADEON_DOMAIN_GTT)
|
else if (bo->b.base.placement & RADEON_DOMAIN_GTT)
|
||||||
ws->allocated_gtt -= align64(bo->b.base.base.size, ws->info.gart_page_size);
|
ws->allocated_gtt -= align64(bo->b.base.size, ws->info.gart_page_size);
|
||||||
|
|
||||||
simple_mtx_destroy(&bo->lock);
|
simple_mtx_destroy(&bo->lock);
|
||||||
FREE(bo);
|
FREE(bo);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void amdgpu_bo_destroy_or_cache(struct radeon_winsys *rws, struct pb_buffer *_buf)
|
static void amdgpu_bo_destroy_or_cache(struct radeon_winsys *rws, struct pb_buffer_lean *_buf)
|
||||||
{
|
{
|
||||||
struct amdgpu_winsys *ws = amdgpu_winsys(rws);
|
struct amdgpu_winsys *ws = amdgpu_winsys(rws);
|
||||||
struct amdgpu_winsys_bo *bo = amdgpu_winsys_bo(_buf);
|
struct amdgpu_winsys_bo *bo = amdgpu_winsys_bo(_buf);
|
||||||
@@ -259,10 +259,10 @@ static bool amdgpu_bo_do_map(struct radeon_winsys *rws, struct amdgpu_bo_real *b
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (p_atomic_inc_return(&bo->map_count) == 1) {
|
if (p_atomic_inc_return(&bo->map_count) == 1) {
|
||||||
if (bo->b.base.base.placement & RADEON_DOMAIN_VRAM)
|
if (bo->b.base.placement & RADEON_DOMAIN_VRAM)
|
||||||
ws->mapped_vram += bo->b.base.base.size;
|
ws->mapped_vram += bo->b.base.size;
|
||||||
else if (bo->b.base.base.placement & RADEON_DOMAIN_GTT)
|
else if (bo->b.base.placement & RADEON_DOMAIN_GTT)
|
||||||
ws->mapped_gtt += bo->b.base.base.size;
|
ws->mapped_gtt += bo->b.base.size;
|
||||||
ws->num_mapped_buffers++;
|
ws->num_mapped_buffers++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -270,7 +270,7 @@ static bool amdgpu_bo_do_map(struct radeon_winsys *rws, struct amdgpu_bo_real *b
|
|||||||
}
|
}
|
||||||
|
|
||||||
void *amdgpu_bo_map(struct radeon_winsys *rws,
|
void *amdgpu_bo_map(struct radeon_winsys *rws,
|
||||||
struct pb_buffer *buf,
|
struct pb_buffer_lean *buf,
|
||||||
struct radeon_cmdbuf *rcs,
|
struct radeon_cmdbuf *rcs,
|
||||||
enum pipe_map_flags usage)
|
enum pipe_map_flags usage)
|
||||||
{
|
{
|
||||||
@@ -300,7 +300,7 @@ void *amdgpu_bo_map(struct radeon_winsys *rws,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!amdgpu_bo_wait(rws, (struct pb_buffer*)bo, 0,
|
if (!amdgpu_bo_wait(rws, (struct pb_buffer_lean*)bo, 0,
|
||||||
RADEON_USAGE_WRITE)) {
|
RADEON_USAGE_WRITE)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -311,7 +311,7 @@ void *amdgpu_bo_map(struct radeon_winsys *rws,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!amdgpu_bo_wait(rws, (struct pb_buffer*)bo, 0,
|
if (!amdgpu_bo_wait(rws, (struct pb_buffer_lean*)bo, 0,
|
||||||
RADEON_USAGE_READWRITE)) {
|
RADEON_USAGE_READWRITE)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -339,7 +339,7 @@ void *amdgpu_bo_map(struct radeon_winsys *rws,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
amdgpu_bo_wait(rws, (struct pb_buffer*)bo, OS_TIMEOUT_INFINITE,
|
amdgpu_bo_wait(rws, (struct pb_buffer_lean*)bo, OS_TIMEOUT_INFINITE,
|
||||||
RADEON_USAGE_WRITE);
|
RADEON_USAGE_WRITE);
|
||||||
} else {
|
} else {
|
||||||
/* Mapping for write. */
|
/* Mapping for write. */
|
||||||
@@ -354,7 +354,7 @@ void *amdgpu_bo_map(struct radeon_winsys *rws,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
amdgpu_bo_wait(rws, (struct pb_buffer*)bo, OS_TIMEOUT_INFINITE,
|
amdgpu_bo_wait(rws, (struct pb_buffer_lean*)bo, OS_TIMEOUT_INFINITE,
|
||||||
RADEON_USAGE_READWRITE);
|
RADEON_USAGE_READWRITE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -401,7 +401,7 @@ void *amdgpu_bo_map(struct radeon_winsys *rws,
|
|||||||
return (uint8_t*)cpu + offset;
|
return (uint8_t*)cpu + offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
void amdgpu_bo_unmap(struct radeon_winsys *rws, struct pb_buffer *buf)
|
void amdgpu_bo_unmap(struct radeon_winsys *rws, struct pb_buffer_lean *buf)
|
||||||
{
|
{
|
||||||
struct amdgpu_winsys *ws = amdgpu_winsys(rws);
|
struct amdgpu_winsys *ws = amdgpu_winsys(rws);
|
||||||
struct amdgpu_winsys_bo *bo = (struct amdgpu_winsys_bo*)buf;
|
struct amdgpu_winsys_bo *bo = (struct amdgpu_winsys_bo*)buf;
|
||||||
@@ -419,10 +419,10 @@ void amdgpu_bo_unmap(struct radeon_winsys *rws, struct pb_buffer *buf)
|
|||||||
assert(!real->cpu_ptr &&
|
assert(!real->cpu_ptr &&
|
||||||
"too many unmaps or forgot RADEON_MAP_TEMPORARY flag");
|
"too many unmaps or forgot RADEON_MAP_TEMPORARY flag");
|
||||||
|
|
||||||
if (real->b.base.base.placement & RADEON_DOMAIN_VRAM)
|
if (real->b.base.placement & RADEON_DOMAIN_VRAM)
|
||||||
ws->mapped_vram -= real->b.base.base.size;
|
ws->mapped_vram -= real->b.base.size;
|
||||||
else if (real->b.base.base.placement & RADEON_DOMAIN_GTT)
|
else if (real->b.base.placement & RADEON_DOMAIN_GTT)
|
||||||
ws->mapped_gtt -= real->b.base.base.size;
|
ws->mapped_gtt -= real->b.base.size;
|
||||||
ws->num_mapped_buffers--;
|
ws->num_mapped_buffers--;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -491,7 +491,7 @@ static struct amdgpu_winsys_bo *amdgpu_create_bo(struct amdgpu_winsys *ws,
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
bo = &new_bo->b;
|
bo = &new_bo->b;
|
||||||
pb_cache_init_entry(&ws->bo_cache, &new_bo->cache_entry, &bo->b.base.base, heap);
|
pb_cache_init_entry(&ws->bo_cache, &new_bo->cache_entry, &bo->b.base, heap);
|
||||||
bo->b.type = slab_backing ? AMDGPU_BO_REAL_REUSABLE_SLAB : AMDGPU_BO_REAL_REUSABLE;
|
bo->b.type = slab_backing ? AMDGPU_BO_REAL_REUSABLE_SLAB : AMDGPU_BO_REAL_REUSABLE;
|
||||||
} else {
|
} else {
|
||||||
bo = CALLOC_STRUCT(amdgpu_bo_real);
|
bo = CALLOC_STRUCT(amdgpu_bo_real);
|
||||||
@@ -587,11 +587,11 @@ static struct amdgpu_winsys_bo *amdgpu_create_bo(struct amdgpu_winsys *ws,
|
|||||||
}
|
}
|
||||||
|
|
||||||
simple_mtx_init(&bo->lock, mtx_plain);
|
simple_mtx_init(&bo->lock, mtx_plain);
|
||||||
pipe_reference_init(&bo->b.base.base.reference, 1);
|
pipe_reference_init(&bo->b.base.reference, 1);
|
||||||
bo->b.base.base.placement = initial_domain;
|
bo->b.base.placement = initial_domain;
|
||||||
bo->b.base.base.alignment_log2 = util_logbase2(alignment);
|
bo->b.base.alignment_log2 = util_logbase2(alignment);
|
||||||
bo->b.base.base.usage = flags;
|
bo->b.base.usage = flags;
|
||||||
bo->b.base.base.size = size;
|
bo->b.base.size = size;
|
||||||
bo->gpu_address = va;
|
bo->gpu_address = va;
|
||||||
bo->b.unique_id = __sync_fetch_and_add(&ws->next_bo_unique_id, 1);
|
bo->b.unique_id = __sync_fetch_and_add(&ws->next_bo_unique_id, 1);
|
||||||
bo->bo = buf_handle;
|
bo->bo = buf_handle;
|
||||||
@@ -618,7 +618,7 @@ error_bo_alloc:
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool amdgpu_bo_can_reclaim(struct amdgpu_winsys *ws, struct pb_buffer *_buf)
|
bool amdgpu_bo_can_reclaim(struct amdgpu_winsys *ws, struct pb_buffer_lean *_buf)
|
||||||
{
|
{
|
||||||
return amdgpu_bo_wait(&ws->dummy_ws.base, _buf, 0, RADEON_USAGE_READWRITE);
|
return amdgpu_bo_wait(&ws->dummy_ws.base, _buf, 0, RADEON_USAGE_READWRITE);
|
||||||
}
|
}
|
||||||
@@ -632,19 +632,19 @@ bool amdgpu_bo_can_reclaim_slab(void *priv, struct pb_slab_entry *entry)
|
|||||||
|
|
||||||
static unsigned get_slab_wasted_size(struct amdgpu_winsys *ws, struct amdgpu_bo_slab_entry *bo)
|
static unsigned get_slab_wasted_size(struct amdgpu_winsys *ws, struct amdgpu_bo_slab_entry *bo)
|
||||||
{
|
{
|
||||||
assert(bo->b.base.base.size <= bo->entry.slab->entry_size);
|
assert(bo->b.base.size <= bo->entry.slab->entry_size);
|
||||||
assert(bo->b.base.base.size < (1 << bo->b.base.base.alignment_log2) ||
|
assert(bo->b.base.size < (1 << bo->b.base.alignment_log2) ||
|
||||||
bo->b.base.base.size < 1 << ws->bo_slabs.min_order ||
|
bo->b.base.size < 1 << ws->bo_slabs.min_order ||
|
||||||
bo->b.base.base.size > bo->entry.slab->entry_size / 2);
|
bo->b.base.size > bo->entry.slab->entry_size / 2);
|
||||||
return bo->entry.slab->entry_size - bo->b.base.base.size;
|
return bo->entry.slab->entry_size - bo->b.base.size;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void amdgpu_bo_slab_destroy(struct radeon_winsys *rws, struct pb_buffer *_buf)
|
static void amdgpu_bo_slab_destroy(struct radeon_winsys *rws, struct pb_buffer_lean *_buf)
|
||||||
{
|
{
|
||||||
struct amdgpu_winsys *ws = amdgpu_winsys(rws);
|
struct amdgpu_winsys *ws = amdgpu_winsys(rws);
|
||||||
struct amdgpu_bo_slab_entry *bo = get_slab_entry_bo(amdgpu_winsys_bo(_buf));
|
struct amdgpu_bo_slab_entry *bo = get_slab_entry_bo(amdgpu_winsys_bo(_buf));
|
||||||
|
|
||||||
if (bo->b.base.base.placement & RADEON_DOMAIN_VRAM)
|
if (bo->b.base.placement & RADEON_DOMAIN_VRAM)
|
||||||
ws->slab_wasted_vram -= get_slab_wasted_size(ws, bo);
|
ws->slab_wasted_vram -= get_slab_wasted_size(ws, bo);
|
||||||
else
|
else
|
||||||
ws->slab_wasted_gtt -= get_slab_wasted_size(ws, bo);
|
ws->slab_wasted_gtt -= get_slab_wasted_size(ws, bo);
|
||||||
@@ -723,7 +723,7 @@ struct pb_slab *amdgpu_bo_slab_alloc(void *priv, unsigned heap, unsigned entry_s
|
|||||||
assert(slab_bo->b.b.b.type == AMDGPU_BO_REAL_REUSABLE_SLAB);
|
assert(slab_bo->b.b.b.type == AMDGPU_BO_REAL_REUSABLE_SLAB);
|
||||||
|
|
||||||
/* We can get a buffer from pb_cache that is slightly larger. */
|
/* We can get a buffer from pb_cache that is slightly larger. */
|
||||||
slab_size = slab_bo->b.b.b.base.base.size;
|
slab_size = slab_bo->b.b.b.base.size;
|
||||||
|
|
||||||
slab_bo->slab.num_entries = slab_size / entry_size;
|
slab_bo->slab.num_entries = slab_size / entry_size;
|
||||||
slab_bo->slab.num_free = slab_bo->slab.num_entries;
|
slab_bo->slab.num_free = slab_bo->slab.num_entries;
|
||||||
@@ -740,9 +740,9 @@ struct pb_slab *amdgpu_bo_slab_alloc(void *priv, unsigned heap, unsigned entry_s
|
|||||||
for (unsigned i = 0; i < slab_bo->slab.num_entries; ++i) {
|
for (unsigned i = 0; i < slab_bo->slab.num_entries; ++i) {
|
||||||
struct amdgpu_bo_slab_entry *bo = &slab_bo->entries[i];
|
struct amdgpu_bo_slab_entry *bo = &slab_bo->entries[i];
|
||||||
|
|
||||||
bo->b.base.base.placement = domains;
|
bo->b.base.placement = domains;
|
||||||
bo->b.base.base.alignment_log2 = util_logbase2(get_slab_entry_alignment(ws, entry_size));
|
bo->b.base.alignment_log2 = util_logbase2(get_slab_entry_alignment(ws, entry_size));
|
||||||
bo->b.base.base.size = entry_size;
|
bo->b.base.size = entry_size;
|
||||||
bo->b.type = AMDGPU_BO_SLAB_ENTRY;
|
bo->b.type = AMDGPU_BO_SLAB_ENTRY;
|
||||||
bo->b.unique_id = base_id + i;
|
bo->b.unique_id = base_id + i;
|
||||||
|
|
||||||
@@ -767,10 +767,10 @@ fail:
|
|||||||
void amdgpu_bo_slab_free(struct amdgpu_winsys *ws, struct pb_slab *slab)
|
void amdgpu_bo_slab_free(struct amdgpu_winsys *ws, struct pb_slab *slab)
|
||||||
{
|
{
|
||||||
struct amdgpu_bo_real_reusable_slab *bo = get_bo_from_slab(slab);
|
struct amdgpu_bo_real_reusable_slab *bo = get_bo_from_slab(slab);
|
||||||
unsigned slab_size = bo->b.b.b.base.base.size;
|
unsigned slab_size = bo->b.b.b.base.size;
|
||||||
|
|
||||||
assert(bo->slab.num_entries * bo->slab.entry_size <= slab_size);
|
assert(bo->slab.num_entries * bo->slab.entry_size <= slab_size);
|
||||||
if (bo->b.b.b.base.base.placement & RADEON_DOMAIN_VRAM)
|
if (bo->b.b.b.base.placement & RADEON_DOMAIN_VRAM)
|
||||||
ws->slab_wasted_vram -= slab_size - bo->slab.num_entries * bo->slab.entry_size;
|
ws->slab_wasted_vram -= slab_size - bo->slab.num_entries * bo->slab.entry_size;
|
||||||
else
|
else
|
||||||
ws->slab_wasted_gtt -= slab_size - bo->slab.num_entries * bo->slab.entry_size;
|
ws->slab_wasted_gtt -= slab_size - bo->slab.num_entries * bo->slab.entry_size;
|
||||||
@@ -869,7 +869,7 @@ sparse_backing_alloc(struct amdgpu_winsys *ws, struct amdgpu_bo_sparse *bo,
|
|||||||
|
|
||||||
/* Allocate a new backing buffer if necessary. */
|
/* Allocate a new backing buffer if necessary. */
|
||||||
if (!best_backing) {
|
if (!best_backing) {
|
||||||
struct pb_buffer *buf;
|
struct pb_buffer_lean *buf;
|
||||||
uint64_t size;
|
uint64_t size;
|
||||||
uint32_t pages;
|
uint32_t pages;
|
||||||
|
|
||||||
@@ -885,16 +885,16 @@ sparse_backing_alloc(struct amdgpu_winsys *ws, struct amdgpu_bo_sparse *bo,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(bo->num_backing_pages < DIV_ROUND_UP(bo->b.base.base.size, RADEON_SPARSE_PAGE_SIZE));
|
assert(bo->num_backing_pages < DIV_ROUND_UP(bo->b.base.size, RADEON_SPARSE_PAGE_SIZE));
|
||||||
|
|
||||||
size = MIN3(bo->b.base.base.size / 16,
|
size = MIN3(bo->b.base.size / 16,
|
||||||
8 * 1024 * 1024,
|
8 * 1024 * 1024,
|
||||||
bo->b.base.base.size - (uint64_t)bo->num_backing_pages * RADEON_SPARSE_PAGE_SIZE);
|
bo->b.base.size - (uint64_t)bo->num_backing_pages * RADEON_SPARSE_PAGE_SIZE);
|
||||||
size = MAX2(size, RADEON_SPARSE_PAGE_SIZE);
|
size = MAX2(size, RADEON_SPARSE_PAGE_SIZE);
|
||||||
|
|
||||||
buf = amdgpu_bo_create(ws, size, RADEON_SPARSE_PAGE_SIZE,
|
buf = amdgpu_bo_create(ws, size, RADEON_SPARSE_PAGE_SIZE,
|
||||||
bo->b.base.base.placement,
|
bo->b.base.placement,
|
||||||
(bo->b.base.base.usage & ~RADEON_FLAG_SPARSE &
|
(bo->b.base.usage & ~RADEON_FLAG_SPARSE &
|
||||||
/* Set the interprocess sharing flag to disable pb_cache because
|
/* Set the interprocess sharing flag to disable pb_cache because
|
||||||
* amdgpu_bo_wait doesn't wait for active CS jobs.
|
* amdgpu_bo_wait doesn't wait for active CS jobs.
|
||||||
*/
|
*/
|
||||||
@@ -906,7 +906,7 @@ sparse_backing_alloc(struct amdgpu_winsys *ws, struct amdgpu_bo_sparse *bo,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* We might have gotten a bigger buffer than requested via caching. */
|
/* We might have gotten a bigger buffer than requested via caching. */
|
||||||
pages = buf->base.size / RADEON_SPARSE_PAGE_SIZE;
|
pages = buf->size / RADEON_SPARSE_PAGE_SIZE;
|
||||||
|
|
||||||
best_backing->bo = get_real_bo(amdgpu_winsys_bo(buf));
|
best_backing->bo = get_real_bo(amdgpu_winsys_bo(buf));
|
||||||
best_backing->num_chunks = 1;
|
best_backing->num_chunks = 1;
|
||||||
@@ -937,7 +937,7 @@ static void
|
|||||||
sparse_free_backing_buffer(struct amdgpu_winsys *ws, struct amdgpu_bo_sparse *bo,
|
sparse_free_backing_buffer(struct amdgpu_winsys *ws, struct amdgpu_bo_sparse *bo,
|
||||||
struct amdgpu_sparse_backing *backing)
|
struct amdgpu_sparse_backing *backing)
|
||||||
{
|
{
|
||||||
bo->num_backing_pages -= backing->bo->b.base.base.size / RADEON_SPARSE_PAGE_SIZE;
|
bo->num_backing_pages -= backing->bo->b.base.size / RADEON_SPARSE_PAGE_SIZE;
|
||||||
|
|
||||||
simple_mtx_lock(&ws->bo_fence_lock);
|
simple_mtx_lock(&ws->bo_fence_lock);
|
||||||
amdgpu_add_fences(&backing->bo->b, bo->b.num_fences, bo->b.fences);
|
amdgpu_add_fences(&backing->bo->b, bo->b.num_fences, bo->b.fences);
|
||||||
@@ -1008,13 +1008,13 @@ sparse_backing_free(struct amdgpu_winsys *ws, struct amdgpu_bo_sparse *bo,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (backing->num_chunks == 1 && backing->chunks[0].begin == 0 &&
|
if (backing->num_chunks == 1 && backing->chunks[0].begin == 0 &&
|
||||||
backing->chunks[0].end == backing->bo->b.base.base.size / RADEON_SPARSE_PAGE_SIZE)
|
backing->chunks[0].end == backing->bo->b.base.size / RADEON_SPARSE_PAGE_SIZE)
|
||||||
sparse_free_backing_buffer(ws, bo, backing);
|
sparse_free_backing_buffer(ws, bo, backing);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void amdgpu_bo_sparse_destroy(struct radeon_winsys *rws, struct pb_buffer *_buf)
|
static void amdgpu_bo_sparse_destroy(struct radeon_winsys *rws, struct pb_buffer_lean *_buf)
|
||||||
{
|
{
|
||||||
struct amdgpu_winsys *ws = amdgpu_winsys(rws);
|
struct amdgpu_winsys *ws = amdgpu_winsys(rws);
|
||||||
struct amdgpu_bo_sparse *bo = get_sparse_bo(amdgpu_winsys_bo(_buf));
|
struct amdgpu_bo_sparse *bo = get_sparse_bo(amdgpu_winsys_bo(_buf));
|
||||||
@@ -1039,7 +1039,7 @@ static void amdgpu_bo_sparse_destroy(struct radeon_winsys *rws, struct pb_buffer
|
|||||||
FREE(bo);
|
FREE(bo);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pb_buffer *
|
static struct pb_buffer_lean *
|
||||||
amdgpu_bo_sparse_create(struct amdgpu_winsys *ws, uint64_t size,
|
amdgpu_bo_sparse_create(struct amdgpu_winsys *ws, uint64_t size,
|
||||||
enum radeon_bo_domain domain,
|
enum radeon_bo_domain domain,
|
||||||
enum radeon_bo_flag flags)
|
enum radeon_bo_flag flags)
|
||||||
@@ -1061,11 +1061,11 @@ amdgpu_bo_sparse_create(struct amdgpu_winsys *ws, uint64_t size,
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
simple_mtx_init(&bo->lock, mtx_plain);
|
simple_mtx_init(&bo->lock, mtx_plain);
|
||||||
pipe_reference_init(&bo->b.base.base.reference, 1);
|
pipe_reference_init(&bo->b.base.reference, 1);
|
||||||
bo->b.base.base.placement = domain;
|
bo->b.base.placement = domain;
|
||||||
bo->b.base.base.alignment_log2 = util_logbase2(RADEON_SPARSE_PAGE_SIZE);
|
bo->b.base.alignment_log2 = util_logbase2(RADEON_SPARSE_PAGE_SIZE);
|
||||||
bo->b.base.base.usage = flags;
|
bo->b.base.usage = flags;
|
||||||
bo->b.base.base.size = size;
|
bo->b.base.size = size;
|
||||||
bo->b.unique_id = __sync_fetch_and_add(&ws->next_bo_unique_id, 1);
|
bo->b.unique_id = __sync_fetch_and_add(&ws->next_bo_unique_id, 1);
|
||||||
bo->b.type = AMDGPU_BO_SPARSE;
|
bo->b.type = AMDGPU_BO_SPARSE;
|
||||||
|
|
||||||
@@ -1104,7 +1104,7 @@ error_alloc_commitments:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
amdgpu_bo_sparse_commit(struct radeon_winsys *rws, struct pb_buffer *buf,
|
amdgpu_bo_sparse_commit(struct radeon_winsys *rws, struct pb_buffer_lean *buf,
|
||||||
uint64_t offset, uint64_t size, bool commit)
|
uint64_t offset, uint64_t size, bool commit)
|
||||||
{
|
{
|
||||||
struct amdgpu_winsys *ws = amdgpu_winsys(rws);
|
struct amdgpu_winsys *ws = amdgpu_winsys(rws);
|
||||||
@@ -1115,9 +1115,9 @@ amdgpu_bo_sparse_commit(struct radeon_winsys *rws, struct pb_buffer *buf,
|
|||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert(offset % RADEON_SPARSE_PAGE_SIZE == 0);
|
assert(offset % RADEON_SPARSE_PAGE_SIZE == 0);
|
||||||
assert(offset <= bo->b.base.base.size);
|
assert(offset <= bo->b.base.size);
|
||||||
assert(size <= bo->b.base.base.size - offset);
|
assert(size <= bo->b.base.size - offset);
|
||||||
assert(size % RADEON_SPARSE_PAGE_SIZE == 0 || offset + size == bo->b.base.base.size);
|
assert(size % RADEON_SPARSE_PAGE_SIZE == 0 || offset + size == bo->b.base.size);
|
||||||
|
|
||||||
comm = bo->commitments;
|
comm = bo->commitments;
|
||||||
va_page = offset / RADEON_SPARSE_PAGE_SIZE;
|
va_page = offset / RADEON_SPARSE_PAGE_SIZE;
|
||||||
@@ -1233,7 +1233,7 @@ out:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static unsigned
|
static unsigned
|
||||||
amdgpu_bo_find_next_committed_memory(struct pb_buffer *buf,
|
amdgpu_bo_find_next_committed_memory(struct pb_buffer_lean *buf,
|
||||||
uint64_t range_offset, unsigned *range_size)
|
uint64_t range_offset, unsigned *range_size)
|
||||||
{
|
{
|
||||||
struct amdgpu_bo_sparse *bo = get_sparse_bo(amdgpu_winsys_bo(buf));
|
struct amdgpu_bo_sparse *bo = get_sparse_bo(amdgpu_winsys_bo(buf));
|
||||||
@@ -1245,7 +1245,7 @@ amdgpu_bo_find_next_committed_memory(struct pb_buffer *buf,
|
|||||||
if (*range_size == 0)
|
if (*range_size == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
assert(*range_size + range_offset <= bo->b.base.base.size);
|
assert(*range_size + range_offset <= bo->b.base.size);
|
||||||
|
|
||||||
uncommitted_range_prev = uncommitted_range_next = 0;
|
uncommitted_range_prev = uncommitted_range_next = 0;
|
||||||
comm = bo->commitments;
|
comm = bo->commitments;
|
||||||
@@ -1287,7 +1287,7 @@ amdgpu_bo_find_next_committed_memory(struct pb_buffer *buf,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void amdgpu_buffer_get_metadata(struct radeon_winsys *rws,
|
static void amdgpu_buffer_get_metadata(struct radeon_winsys *rws,
|
||||||
struct pb_buffer *_buf,
|
struct pb_buffer_lean *_buf,
|
||||||
struct radeon_bo_metadata *md,
|
struct radeon_bo_metadata *md,
|
||||||
struct radeon_surf *surf)
|
struct radeon_surf *surf)
|
||||||
{
|
{
|
||||||
@@ -1308,7 +1308,7 @@ static void amdgpu_buffer_get_metadata(struct radeon_winsys *rws,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void amdgpu_buffer_set_metadata(struct radeon_winsys *rws,
|
static void amdgpu_buffer_set_metadata(struct radeon_winsys *rws,
|
||||||
struct pb_buffer *_buf,
|
struct pb_buffer_lean *_buf,
|
||||||
struct radeon_bo_metadata *md,
|
struct radeon_bo_metadata *md,
|
||||||
struct radeon_surf *surf)
|
struct radeon_surf *surf)
|
||||||
{
|
{
|
||||||
@@ -1324,7 +1324,7 @@ static void amdgpu_buffer_set_metadata(struct radeon_winsys *rws,
|
|||||||
amdgpu_bo_set_metadata(bo->bo, &metadata);
|
amdgpu_bo_set_metadata(bo->bo, &metadata);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct pb_buffer *
|
struct pb_buffer_lean *
|
||||||
amdgpu_bo_create(struct amdgpu_winsys *ws,
|
amdgpu_bo_create(struct amdgpu_winsys *ws,
|
||||||
uint64_t size,
|
uint64_t size,
|
||||||
unsigned alignment,
|
unsigned alignment,
|
||||||
@@ -1381,9 +1381,9 @@ amdgpu_bo_create(struct amdgpu_winsys *ws,
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
struct amdgpu_bo_slab_entry *slab_bo = container_of(entry, struct amdgpu_bo_slab_entry, entry);
|
struct amdgpu_bo_slab_entry *slab_bo = container_of(entry, struct amdgpu_bo_slab_entry, entry);
|
||||||
pipe_reference_init(&slab_bo->b.base.base.reference, 1);
|
pipe_reference_init(&slab_bo->b.base.reference, 1);
|
||||||
slab_bo->b.base.base.size = size;
|
slab_bo->b.base.size = size;
|
||||||
assert(alignment <= 1 << slab_bo->b.base.base.alignment_log2);
|
assert(alignment <= 1 << slab_bo->b.base.alignment_log2);
|
||||||
|
|
||||||
if (domain & RADEON_DOMAIN_VRAM)
|
if (domain & RADEON_DOMAIN_VRAM)
|
||||||
ws->slab_wasted_vram += get_slab_wasted_size(ws, slab_bo);
|
ws->slab_wasted_vram += get_slab_wasted_size(ws, slab_bo);
|
||||||
@@ -1451,19 +1451,19 @@ no_slab:
|
|||||||
return &bo->base;
|
return &bo->base;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pb_buffer *
|
static struct pb_buffer_lean *
|
||||||
amdgpu_buffer_create(struct radeon_winsys *ws,
|
amdgpu_buffer_create(struct radeon_winsys *ws,
|
||||||
uint64_t size,
|
uint64_t size,
|
||||||
unsigned alignment,
|
unsigned alignment,
|
||||||
enum radeon_bo_domain domain,
|
enum radeon_bo_domain domain,
|
||||||
enum radeon_bo_flag flags)
|
enum radeon_bo_flag flags)
|
||||||
{
|
{
|
||||||
struct pb_buffer * res = amdgpu_bo_create(amdgpu_winsys(ws), size, alignment, domain,
|
struct pb_buffer_lean * res = amdgpu_bo_create(amdgpu_winsys(ws), size, alignment, domain,
|
||||||
flags);
|
flags);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pb_buffer *amdgpu_bo_from_handle(struct radeon_winsys *rws,
|
static struct pb_buffer_lean *amdgpu_bo_from_handle(struct radeon_winsys *rws,
|
||||||
struct winsys_handle *whandle,
|
struct winsys_handle *whandle,
|
||||||
unsigned vm_alignment,
|
unsigned vm_alignment,
|
||||||
bool is_prime_linear_buffer)
|
bool is_prime_linear_buffer)
|
||||||
@@ -1501,7 +1501,7 @@ static struct pb_buffer *amdgpu_bo_from_handle(struct radeon_winsys *rws,
|
|||||||
* counter and return it.
|
* counter and return it.
|
||||||
*/
|
*/
|
||||||
if (bo) {
|
if (bo) {
|
||||||
p_atomic_inc(&bo->b.base.base.reference.count);
|
p_atomic_inc(&bo->b.base.reference.count);
|
||||||
simple_mtx_unlock(&ws->bo_export_table_lock);
|
simple_mtx_unlock(&ws->bo_export_table_lock);
|
||||||
|
|
||||||
/* Release the buffer handle, because we don't need it anymore.
|
/* Release the buffer handle, because we don't need it anymore.
|
||||||
@@ -1555,12 +1555,12 @@ static struct pb_buffer *amdgpu_bo_from_handle(struct radeon_winsys *rws,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize the structure. */
|
/* Initialize the structure. */
|
||||||
pipe_reference_init(&bo->b.base.base.reference, 1);
|
pipe_reference_init(&bo->b.base.reference, 1);
|
||||||
bo->b.base.base.placement = initial;
|
bo->b.base.placement = initial;
|
||||||
bo->b.base.base.alignment_log2 = util_logbase2(info.phys_alignment ?
|
bo->b.base.alignment_log2 = util_logbase2(info.phys_alignment ?
|
||||||
info.phys_alignment : ws->info.gart_page_size);
|
info.phys_alignment : ws->info.gart_page_size);
|
||||||
bo->b.base.base.usage = flags;
|
bo->b.base.usage = flags;
|
||||||
bo->b.base.base.size = result.alloc_size;
|
bo->b.base.size = result.alloc_size;
|
||||||
bo->b.type = AMDGPU_BO_REAL;
|
bo->b.type = AMDGPU_BO_REAL;
|
||||||
bo->gpu_address = va;
|
bo->gpu_address = va;
|
||||||
bo->b.unique_id = __sync_fetch_and_add(&ws->next_bo_unique_id, 1);
|
bo->b.unique_id = __sync_fetch_and_add(&ws->next_bo_unique_id, 1);
|
||||||
@@ -1569,10 +1569,10 @@ static struct pb_buffer *amdgpu_bo_from_handle(struct radeon_winsys *rws,
|
|||||||
bo->va_handle = va_handle;
|
bo->va_handle = va_handle;
|
||||||
bo->is_shared = true;
|
bo->is_shared = true;
|
||||||
|
|
||||||
if (bo->b.base.base.placement & RADEON_DOMAIN_VRAM)
|
if (bo->b.base.placement & RADEON_DOMAIN_VRAM)
|
||||||
ws->allocated_vram += align64(bo->b.base.base.size, ws->info.gart_page_size);
|
ws->allocated_vram += align64(bo->b.base.size, ws->info.gart_page_size);
|
||||||
else if (bo->b.base.base.placement & RADEON_DOMAIN_GTT)
|
else if (bo->b.base.placement & RADEON_DOMAIN_GTT)
|
||||||
ws->allocated_gtt += align64(bo->b.base.base.size, ws->info.gart_page_size);
|
ws->allocated_gtt += align64(bo->b.base.size, ws->info.gart_page_size);
|
||||||
|
|
||||||
amdgpu_bo_export(bo->bo, amdgpu_bo_handle_type_kms, &bo->kms_handle);
|
amdgpu_bo_export(bo->bo, amdgpu_bo_handle_type_kms, &bo->kms_handle);
|
||||||
|
|
||||||
@@ -1594,7 +1594,7 @@ error:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool amdgpu_bo_get_handle(struct radeon_winsys *rws,
|
static bool amdgpu_bo_get_handle(struct radeon_winsys *rws,
|
||||||
struct pb_buffer *buffer,
|
struct pb_buffer_lean *buffer,
|
||||||
struct winsys_handle *whandle)
|
struct winsys_handle *whandle)
|
||||||
{
|
{
|
||||||
struct amdgpu_screen_winsys *sws = amdgpu_screen_winsys(rws);
|
struct amdgpu_screen_winsys *sws = amdgpu_screen_winsys(rws);
|
||||||
@@ -1679,7 +1679,7 @@ static bool amdgpu_bo_get_handle(struct radeon_winsys *rws,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pb_buffer *amdgpu_bo_from_ptr(struct radeon_winsys *rws,
|
static struct pb_buffer_lean *amdgpu_bo_from_ptr(struct radeon_winsys *rws,
|
||||||
void *pointer, uint64_t size,
|
void *pointer, uint64_t size,
|
||||||
enum radeon_bo_flag flags)
|
enum radeon_bo_flag flags)
|
||||||
{
|
{
|
||||||
@@ -1711,10 +1711,10 @@ static struct pb_buffer *amdgpu_bo_from_ptr(struct radeon_winsys *rws,
|
|||||||
|
|
||||||
/* Initialize it. */
|
/* Initialize it. */
|
||||||
bo->is_user_ptr = true;
|
bo->is_user_ptr = true;
|
||||||
pipe_reference_init(&bo->b.base.base.reference, 1);
|
pipe_reference_init(&bo->b.base.reference, 1);
|
||||||
bo->b.base.base.placement = RADEON_DOMAIN_GTT;
|
bo->b.base.placement = RADEON_DOMAIN_GTT;
|
||||||
bo->b.base.base.alignment_log2 = 0;
|
bo->b.base.alignment_log2 = 0;
|
||||||
bo->b.base.base.size = size;
|
bo->b.base.size = size;
|
||||||
bo->b.type = AMDGPU_BO_REAL;
|
bo->b.type = AMDGPU_BO_REAL;
|
||||||
bo->gpu_address = va;
|
bo->gpu_address = va;
|
||||||
bo->b.unique_id = __sync_fetch_and_add(&ws->next_bo_unique_id, 1);
|
bo->b.unique_id = __sync_fetch_and_add(&ws->next_bo_unique_id, 1);
|
||||||
@@ -1729,7 +1729,7 @@ static struct pb_buffer *amdgpu_bo_from_ptr(struct radeon_winsys *rws,
|
|||||||
|
|
||||||
amdgpu_bo_export(bo->bo, amdgpu_bo_handle_type_kms, &bo->kms_handle);
|
amdgpu_bo_export(bo->bo, amdgpu_bo_handle_type_kms, &bo->kms_handle);
|
||||||
|
|
||||||
return (struct pb_buffer*)bo;
|
return (struct pb_buffer_lean*)bo;
|
||||||
|
|
||||||
error_va_map:
|
error_va_map:
|
||||||
amdgpu_va_range_free(va_handle);
|
amdgpu_va_range_free(va_handle);
|
||||||
@@ -1742,21 +1742,21 @@ error:
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool amdgpu_bo_is_user_ptr(struct pb_buffer *buf)
|
static bool amdgpu_bo_is_user_ptr(struct pb_buffer_lean *buf)
|
||||||
{
|
{
|
||||||
struct amdgpu_winsys_bo *bo = (struct amdgpu_winsys_bo*)buf;
|
struct amdgpu_winsys_bo *bo = (struct amdgpu_winsys_bo*)buf;
|
||||||
|
|
||||||
return is_real_bo(bo) ? get_real_bo(bo)->is_user_ptr : false;
|
return is_real_bo(bo) ? get_real_bo(bo)->is_user_ptr : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool amdgpu_bo_is_suballocated(struct pb_buffer *buf)
|
static bool amdgpu_bo_is_suballocated(struct pb_buffer_lean *buf)
|
||||||
{
|
{
|
||||||
struct amdgpu_winsys_bo *bo = (struct amdgpu_winsys_bo*)buf;
|
struct amdgpu_winsys_bo *bo = (struct amdgpu_winsys_bo*)buf;
|
||||||
|
|
||||||
return bo->type == AMDGPU_BO_SLAB_ENTRY;
|
return bo->type == AMDGPU_BO_SLAB_ENTRY;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t amdgpu_bo_get_va(struct pb_buffer *buf)
|
uint64_t amdgpu_bo_get_va(struct pb_buffer_lean *buf)
|
||||||
{
|
{
|
||||||
struct amdgpu_winsys_bo *bo = amdgpu_winsys_bo(buf);
|
struct amdgpu_winsys_bo *bo = amdgpu_winsys_bo(buf);
|
||||||
|
|
||||||
@@ -1772,7 +1772,7 @@ uint64_t amdgpu_bo_get_va(struct pb_buffer *buf)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void amdgpu_buffer_destroy(struct radeon_winsys *ws, struct pb_buffer *buf)
|
static void amdgpu_buffer_destroy(struct radeon_winsys *ws, struct pb_buffer_lean *buf)
|
||||||
{
|
{
|
||||||
struct amdgpu_winsys_bo *bo = amdgpu_winsys_bo(buf);
|
struct amdgpu_winsys_bo *bo = amdgpu_winsys_bo(buf);
|
||||||
|
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ enum amdgpu_bo_type {
|
|||||||
|
|
||||||
/* Base class of the buffer object that other structures inherit. */
|
/* Base class of the buffer object that other structures inherit. */
|
||||||
struct amdgpu_winsys_bo {
|
struct amdgpu_winsys_bo {
|
||||||
struct pb_buffer base;
|
struct pb_buffer_lean base;
|
||||||
enum amdgpu_bo_type type;
|
enum amdgpu_bo_type type;
|
||||||
|
|
||||||
uint32_t unique_id;
|
uint32_t unique_id;
|
||||||
@@ -153,7 +153,7 @@ static struct amdgpu_bo_real_reusable *get_real_bo_reusable(struct amdgpu_winsys
|
|||||||
|
|
||||||
static struct amdgpu_bo_sparse *get_sparse_bo(struct amdgpu_winsys_bo *bo)
|
static struct amdgpu_bo_sparse *get_sparse_bo(struct amdgpu_winsys_bo *bo)
|
||||||
{
|
{
|
||||||
assert(bo->type == AMDGPU_BO_SPARSE && bo->base.base.usage & RADEON_FLAG_SPARSE);
|
assert(bo->type == AMDGPU_BO_SPARSE && bo->base.usage & RADEON_FLAG_SPARSE);
|
||||||
return (struct amdgpu_bo_sparse*)bo;
|
return (struct amdgpu_bo_sparse*)bo;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -174,28 +174,28 @@ static struct amdgpu_bo_real *get_slab_entry_real_bo(struct amdgpu_winsys_bo *bo
|
|||||||
return &get_bo_from_slab(((struct amdgpu_bo_slab_entry*)bo)->entry.slab)->b.b;
|
return &get_bo_from_slab(((struct amdgpu_bo_slab_entry*)bo)->entry.slab)->b.b;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool amdgpu_bo_can_reclaim(struct amdgpu_winsys *ws, struct pb_buffer *_buf);
|
bool amdgpu_bo_can_reclaim(struct amdgpu_winsys *ws, struct pb_buffer_lean *_buf);
|
||||||
struct pb_buffer *amdgpu_bo_create(struct amdgpu_winsys *ws,
|
struct pb_buffer_lean *amdgpu_bo_create(struct amdgpu_winsys *ws,
|
||||||
uint64_t size,
|
uint64_t size,
|
||||||
unsigned alignment,
|
unsigned alignment,
|
||||||
enum radeon_bo_domain domain,
|
enum radeon_bo_domain domain,
|
||||||
enum radeon_bo_flag flags);
|
enum radeon_bo_flag flags);
|
||||||
void amdgpu_bo_destroy(struct amdgpu_winsys *ws, struct pb_buffer *_buf);
|
void amdgpu_bo_destroy(struct amdgpu_winsys *ws, struct pb_buffer_lean *_buf);
|
||||||
void *amdgpu_bo_map(struct radeon_winsys *rws,
|
void *amdgpu_bo_map(struct radeon_winsys *rws,
|
||||||
struct pb_buffer *buf,
|
struct pb_buffer_lean *buf,
|
||||||
struct radeon_cmdbuf *rcs,
|
struct radeon_cmdbuf *rcs,
|
||||||
enum pipe_map_flags usage);
|
enum pipe_map_flags usage);
|
||||||
void amdgpu_bo_unmap(struct radeon_winsys *rws, struct pb_buffer *buf);
|
void amdgpu_bo_unmap(struct radeon_winsys *rws, struct pb_buffer_lean *buf);
|
||||||
void amdgpu_bo_init_functions(struct amdgpu_screen_winsys *ws);
|
void amdgpu_bo_init_functions(struct amdgpu_screen_winsys *ws);
|
||||||
|
|
||||||
bool amdgpu_bo_can_reclaim_slab(void *priv, struct pb_slab_entry *entry);
|
bool amdgpu_bo_can_reclaim_slab(void *priv, struct pb_slab_entry *entry);
|
||||||
struct pb_slab *amdgpu_bo_slab_alloc(void *priv, unsigned heap, unsigned entry_size,
|
struct pb_slab *amdgpu_bo_slab_alloc(void *priv, unsigned heap, unsigned entry_size,
|
||||||
unsigned group_index);
|
unsigned group_index);
|
||||||
void amdgpu_bo_slab_free(struct amdgpu_winsys *ws, struct pb_slab *slab);
|
void amdgpu_bo_slab_free(struct amdgpu_winsys *ws, struct pb_slab *slab);
|
||||||
uint64_t amdgpu_bo_get_va(struct pb_buffer *buf);
|
uint64_t amdgpu_bo_get_va(struct pb_buffer_lean *buf);
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
struct amdgpu_winsys_bo *amdgpu_winsys_bo(struct pb_buffer *bo)
|
struct amdgpu_winsys_bo *amdgpu_winsys_bo(struct pb_buffer_lean *bo)
|
||||||
{
|
{
|
||||||
return (struct amdgpu_winsys_bo *)bo;
|
return (struct amdgpu_winsys_bo *)bo;
|
||||||
}
|
}
|
||||||
@@ -206,7 +206,7 @@ void amdgpu_winsys_bo_reference(struct amdgpu_winsys *ws,
|
|||||||
struct amdgpu_winsys_bo *src)
|
struct amdgpu_winsys_bo *src)
|
||||||
{
|
{
|
||||||
radeon_bo_reference(&ws->dummy_ws.base,
|
radeon_bo_reference(&ws->dummy_ws.base,
|
||||||
(struct pb_buffer**)dst, (struct pb_buffer*)src);
|
(struct pb_buffer_lean**)dst, (struct pb_buffer_lean*)src);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -652,7 +652,7 @@ amdgpu_lookup_or_add_slab_buffer(struct amdgpu_cs_context *cs, struct amdgpu_win
|
|||||||
}
|
}
|
||||||
|
|
||||||
static unsigned amdgpu_cs_add_buffer(struct radeon_cmdbuf *rcs,
|
static unsigned amdgpu_cs_add_buffer(struct radeon_cmdbuf *rcs,
|
||||||
struct pb_buffer *buf,
|
struct pb_buffer_lean *buf,
|
||||||
unsigned usage,
|
unsigned usage,
|
||||||
enum radeon_bo_domain domains)
|
enum radeon_bo_domain domains)
|
||||||
{
|
{
|
||||||
@@ -699,7 +699,7 @@ static bool amdgpu_ib_new_buffer(struct amdgpu_winsys *ws,
|
|||||||
struct amdgpu_ib *main_ib,
|
struct amdgpu_ib *main_ib,
|
||||||
struct amdgpu_cs *cs)
|
struct amdgpu_cs *cs)
|
||||||
{
|
{
|
||||||
struct pb_buffer *pb;
|
struct pb_buffer_lean *pb;
|
||||||
uint8_t *mapped;
|
uint8_t *mapped;
|
||||||
unsigned buffer_size;
|
unsigned buffer_size;
|
||||||
|
|
||||||
@@ -795,7 +795,7 @@ static bool amdgpu_get_new_ib(struct amdgpu_winsys *ws,
|
|||||||
|
|
||||||
/* Allocate a new buffer for IBs if the current buffer is all used. */
|
/* Allocate a new buffer for IBs if the current buffer is all used. */
|
||||||
if (!main_ib->big_buffer ||
|
if (!main_ib->big_buffer ||
|
||||||
main_ib->used_ib_space + ib_size > main_ib->big_buffer->base.size) {
|
main_ib->used_ib_space + ib_size > main_ib->big_buffer->size) {
|
||||||
if (!amdgpu_ib_new_buffer(ws, main_ib, cs))
|
if (!amdgpu_ib_new_buffer(ws, main_ib, cs))
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -814,7 +814,7 @@ static bool amdgpu_get_new_ib(struct amdgpu_winsys *ws,
|
|||||||
|
|
||||||
cs->csc->ib_main_addr = rcs->current.buf;
|
cs->csc->ib_main_addr = rcs->current.buf;
|
||||||
|
|
||||||
ib_size = main_ib->big_buffer->base.size - main_ib->used_ib_space;
|
ib_size = main_ib->big_buffer->size - main_ib->used_ib_space;
|
||||||
rcs->current.max_dw = ib_size / 4 - amdgpu_cs_epilog_dws(cs);
|
rcs->current.max_dw = ib_size / 4 - amdgpu_cs_epilog_dws(cs);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1026,7 +1026,7 @@ amdgpu_cs_setup_preemption(struct radeon_cmdbuf *rcs, const uint32_t *preamble_i
|
|||||||
struct amdgpu_winsys *ws = cs->ws;
|
struct amdgpu_winsys *ws = cs->ws;
|
||||||
struct amdgpu_cs_context *csc[2] = {&cs->csc1, &cs->csc2};
|
struct amdgpu_cs_context *csc[2] = {&cs->csc1, &cs->csc2};
|
||||||
unsigned size = align(preamble_num_dw * 4, ws->info.ip[AMD_IP_GFX].ib_alignment);
|
unsigned size = align(preamble_num_dw * 4, ws->info.ip[AMD_IP_GFX].ib_alignment);
|
||||||
struct pb_buffer *preamble_bo;
|
struct pb_buffer_lean *preamble_bo;
|
||||||
uint32_t *map;
|
uint32_t *map;
|
||||||
|
|
||||||
/* Create the preamble IB buffer. */
|
/* Create the preamble IB buffer. */
|
||||||
@@ -1146,7 +1146,7 @@ static bool amdgpu_cs_check_space(struct radeon_cmdbuf *rcs, unsigned dw)
|
|||||||
rcs->current.cdw = 0;
|
rcs->current.cdw = 0;
|
||||||
|
|
||||||
rcs->current.buf = (uint32_t*)(main_ib->big_buffer_cpu_ptr + main_ib->used_ib_space);
|
rcs->current.buf = (uint32_t*)(main_ib->big_buffer_cpu_ptr + main_ib->used_ib_space);
|
||||||
rcs->current.max_dw = main_ib->big_buffer->base.size / 4 - cs_epilog_dw;
|
rcs->current.max_dw = main_ib->big_buffer->size / 4 - cs_epilog_dw;
|
||||||
|
|
||||||
amdgpu_cs_add_buffer(rcs, main_ib->big_buffer,
|
amdgpu_cs_add_buffer(rcs, main_ib->big_buffer,
|
||||||
RADEON_USAGE_READ | RADEON_PRIO_IB, 0);
|
RADEON_USAGE_READ | RADEON_PRIO_IB, 0);
|
||||||
@@ -1163,7 +1163,7 @@ static unsigned amdgpu_cs_get_buffer_list(struct radeon_cmdbuf *rcs,
|
|||||||
|
|
||||||
if (list) {
|
if (list) {
|
||||||
for (unsigned i = 0; i < num_real_buffers; i++) {
|
for (unsigned i = 0; i < num_real_buffers; i++) {
|
||||||
list[i].bo_size = real_buffers->buffers[i].bo->base.base.size;
|
list[i].bo_size = real_buffers->buffers[i].bo->base.size;
|
||||||
list[i].vm_address = get_real_bo(real_buffers->buffers[i].bo)->gpu_address;
|
list[i].vm_address = get_real_bo(real_buffers->buffers[i].bo)->gpu_address;
|
||||||
list[i].priority_usage = real_buffers->buffers[i].usage;
|
list[i].priority_usage = real_buffers->buffers[i].usage;
|
||||||
}
|
}
|
||||||
@@ -1785,7 +1785,7 @@ static void amdgpu_cs_destroy(struct radeon_cmdbuf *rcs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool amdgpu_bo_is_referenced(struct radeon_cmdbuf *rcs,
|
static bool amdgpu_bo_is_referenced(struct radeon_cmdbuf *rcs,
|
||||||
struct pb_buffer *_buf,
|
struct pb_buffer_lean *_buf,
|
||||||
unsigned usage)
|
unsigned usage)
|
||||||
{
|
{
|
||||||
struct amdgpu_cs *cs = amdgpu_cs(rcs);
|
struct amdgpu_cs *cs = amdgpu_cs(rcs);
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ enum ib_type {
|
|||||||
|
|
||||||
struct amdgpu_ib {
|
struct amdgpu_ib {
|
||||||
/* A buffer out of which new IBs are allocated. */
|
/* A buffer out of which new IBs are allocated. */
|
||||||
struct pb_buffer *big_buffer;
|
struct pb_buffer_lean *big_buffer;
|
||||||
uint8_t *big_buffer_cpu_ptr;
|
uint8_t *big_buffer_cpu_ptr;
|
||||||
uint64_t gpu_address;
|
uint64_t gpu_address;
|
||||||
unsigned used_ib_space;
|
unsigned used_ib_space;
|
||||||
@@ -145,7 +145,7 @@ struct amdgpu_cs {
|
|||||||
|
|
||||||
struct util_queue_fence flush_completed;
|
struct util_queue_fence flush_completed;
|
||||||
struct pipe_fence_handle *next_fence;
|
struct pipe_fence_handle *next_fence;
|
||||||
struct pb_buffer *preamble_ib_bo;
|
struct pb_buffer_lean *preamble_ib_bo;
|
||||||
|
|
||||||
struct drm_amdgpu_cs_chunk_cp_gfx_shadow mcbp_fw_shadow_chunk;
|
struct drm_amdgpu_cs_chunk_cp_gfx_shadow mcbp_fw_shadow_chunk;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -21,14 +21,14 @@
|
|||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
|
||||||
static struct pb_buffer *
|
static struct pb_buffer_lean *
|
||||||
radeon_winsys_bo_create(struct radeon_winsys *rws,
|
radeon_winsys_bo_create(struct radeon_winsys *rws,
|
||||||
uint64_t size,
|
uint64_t size,
|
||||||
unsigned alignment,
|
unsigned alignment,
|
||||||
enum radeon_bo_domain domain,
|
enum radeon_bo_domain domain,
|
||||||
enum radeon_bo_flag flags);
|
enum radeon_bo_flag flags);
|
||||||
|
|
||||||
static inline struct radeon_bo *radeon_bo(struct pb_buffer *bo)
|
static inline struct radeon_bo *radeon_bo(struct pb_buffer_lean *bo)
|
||||||
{
|
{
|
||||||
return (struct radeon_bo *)bo;
|
return (struct radeon_bo *)bo;
|
||||||
}
|
}
|
||||||
@@ -109,7 +109,7 @@ static void radeon_bo_wait_idle(struct radeon_winsys *rws, struct radeon_bo *bo)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool radeon_bo_wait(struct radeon_winsys *rws,
|
static bool radeon_bo_wait(struct radeon_winsys *rws,
|
||||||
struct pb_buffer *_buf, uint64_t timeout,
|
struct pb_buffer_lean *_buf, uint64_t timeout,
|
||||||
unsigned usage)
|
unsigned usage)
|
||||||
{
|
{
|
||||||
struct radeon_bo *bo = radeon_bo(_buf);
|
struct radeon_bo *bo = radeon_bo(_buf);
|
||||||
@@ -154,7 +154,7 @@ static enum radeon_bo_domain get_valid_domain(enum radeon_bo_domain domain)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static enum radeon_bo_domain radeon_bo_get_initial_domain(
|
static enum radeon_bo_domain radeon_bo_get_initial_domain(
|
||||||
struct pb_buffer *buf)
|
struct pb_buffer_lean *buf)
|
||||||
{
|
{
|
||||||
struct radeon_bo *bo = (struct radeon_bo*)buf;
|
struct radeon_bo *bo = (struct radeon_bo*)buf;
|
||||||
struct drm_radeon_gem_op args;
|
struct drm_radeon_gem_op args;
|
||||||
@@ -329,7 +329,7 @@ out:
|
|||||||
|
|
||||||
void radeon_bo_destroy(void *winsys, struct pb_buffer_lean *_buf)
|
void radeon_bo_destroy(void *winsys, struct pb_buffer_lean *_buf)
|
||||||
{
|
{
|
||||||
struct radeon_bo *bo = radeon_bo((struct pb_buffer*)_buf);
|
struct radeon_bo *bo = radeon_bo((struct pb_buffer_lean*)_buf);
|
||||||
struct radeon_drm_winsys *rws = bo->rws;
|
struct radeon_drm_winsys *rws = bo->rws;
|
||||||
struct drm_gem_close args;
|
struct drm_gem_close args;
|
||||||
|
|
||||||
@@ -339,7 +339,7 @@ void radeon_bo_destroy(void *winsys, struct pb_buffer_lean *_buf)
|
|||||||
|
|
||||||
mtx_lock(&rws->bo_handles_mutex);
|
mtx_lock(&rws->bo_handles_mutex);
|
||||||
/* radeon_winsys_bo_from_handle might have revived the bo */
|
/* radeon_winsys_bo_from_handle might have revived the bo */
|
||||||
if (pipe_is_referenced(&bo->base.base.reference)) {
|
if (pipe_is_referenced(&bo->base.reference)) {
|
||||||
mtx_unlock(&rws->bo_handles_mutex);
|
mtx_unlock(&rws->bo_handles_mutex);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -351,7 +351,7 @@ void radeon_bo_destroy(void *winsys, struct pb_buffer_lean *_buf)
|
|||||||
mtx_unlock(&rws->bo_handles_mutex);
|
mtx_unlock(&rws->bo_handles_mutex);
|
||||||
|
|
||||||
if (bo->u.real.ptr)
|
if (bo->u.real.ptr)
|
||||||
os_munmap(bo->u.real.ptr, bo->base.base.size);
|
os_munmap(bo->u.real.ptr, bo->base.size);
|
||||||
|
|
||||||
if (rws->info.r600_has_virtual_memory) {
|
if (rws->info.r600_has_virtual_memory) {
|
||||||
if (rws->va_unmap_working) {
|
if (rws->va_unmap_working) {
|
||||||
@@ -369,14 +369,14 @@ void radeon_bo_destroy(void *winsys, struct pb_buffer_lean *_buf)
|
|||||||
sizeof(va)) != 0 &&
|
sizeof(va)) != 0 &&
|
||||||
va.operation == RADEON_VA_RESULT_ERROR) {
|
va.operation == RADEON_VA_RESULT_ERROR) {
|
||||||
fprintf(stderr, "radeon: Failed to deallocate virtual address for buffer:\n");
|
fprintf(stderr, "radeon: Failed to deallocate virtual address for buffer:\n");
|
||||||
fprintf(stderr, "radeon: size : %"PRIu64" bytes\n", bo->base.base.size);
|
fprintf(stderr, "radeon: size : %"PRIu64" bytes\n", bo->base.size);
|
||||||
fprintf(stderr, "radeon: va : 0x%"PRIx64"\n", bo->va);
|
fprintf(stderr, "radeon: va : 0x%"PRIx64"\n", bo->va);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
radeon_bomgr_free_va(&rws->info,
|
radeon_bomgr_free_va(&rws->info,
|
||||||
bo->va < rws->vm32.end ? &rws->vm32 : &rws->vm64,
|
bo->va < rws->vm32.end ? &rws->vm32 : &rws->vm64,
|
||||||
bo->va, bo->base.base.size);
|
bo->va, bo->base.size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Close object. */
|
/* Close object. */
|
||||||
@@ -386,22 +386,22 @@ void radeon_bo_destroy(void *winsys, struct pb_buffer_lean *_buf)
|
|||||||
mtx_destroy(&bo->u.real.map_mutex);
|
mtx_destroy(&bo->u.real.map_mutex);
|
||||||
|
|
||||||
if (bo->initial_domain & RADEON_DOMAIN_VRAM)
|
if (bo->initial_domain & RADEON_DOMAIN_VRAM)
|
||||||
rws->allocated_vram -= align(bo->base.base.size, rws->info.gart_page_size);
|
rws->allocated_vram -= align(bo->base.size, rws->info.gart_page_size);
|
||||||
else if (bo->initial_domain & RADEON_DOMAIN_GTT)
|
else if (bo->initial_domain & RADEON_DOMAIN_GTT)
|
||||||
rws->allocated_gtt -= align(bo->base.base.size, rws->info.gart_page_size);
|
rws->allocated_gtt -= align(bo->base.size, rws->info.gart_page_size);
|
||||||
|
|
||||||
if (bo->u.real.map_count >= 1) {
|
if (bo->u.real.map_count >= 1) {
|
||||||
if (bo->initial_domain & RADEON_DOMAIN_VRAM)
|
if (bo->initial_domain & RADEON_DOMAIN_VRAM)
|
||||||
bo->rws->mapped_vram -= bo->base.base.size;
|
bo->rws->mapped_vram -= bo->base.size;
|
||||||
else
|
else
|
||||||
bo->rws->mapped_gtt -= bo->base.base.size;
|
bo->rws->mapped_gtt -= bo->base.size;
|
||||||
bo->rws->num_mapped_buffers--;
|
bo->rws->num_mapped_buffers--;
|
||||||
}
|
}
|
||||||
|
|
||||||
FREE(bo);
|
FREE(bo);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void radeon_bo_destroy_or_cache(void *winsys, struct pb_buffer *_buf)
|
static void radeon_bo_destroy_or_cache(void *winsys, struct pb_buffer_lean *_buf)
|
||||||
{
|
{
|
||||||
struct radeon_drm_winsys *rws = (struct radeon_drm_winsys *)winsys;
|
struct radeon_drm_winsys *rws = (struct radeon_drm_winsys *)winsys;
|
||||||
struct radeon_bo *bo = radeon_bo(_buf);
|
struct radeon_bo *bo = radeon_bo(_buf);
|
||||||
@@ -411,7 +411,7 @@ static void radeon_bo_destroy_or_cache(void *winsys, struct pb_buffer *_buf)
|
|||||||
if (bo->u.real.use_reusable_pool)
|
if (bo->u.real.use_reusable_pool)
|
||||||
pb_cache_add_buffer(&rws->bo_cache, &bo->u.real.cache_entry);
|
pb_cache_add_buffer(&rws->bo_cache, &bo->u.real.cache_entry);
|
||||||
else
|
else
|
||||||
radeon_bo_destroy(NULL, &_buf->base);
|
radeon_bo_destroy(NULL, _buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *radeon_bo_do_map(struct radeon_bo *bo)
|
void *radeon_bo_do_map(struct radeon_bo *bo)
|
||||||
@@ -441,7 +441,7 @@ void *radeon_bo_do_map(struct radeon_bo *bo)
|
|||||||
}
|
}
|
||||||
args.handle = bo->handle;
|
args.handle = bo->handle;
|
||||||
args.offset = 0;
|
args.offset = 0;
|
||||||
args.size = (uint64_t)bo->base.base.size;
|
args.size = (uint64_t)bo->base.size;
|
||||||
if (drmCommandWriteRead(bo->rws->fd,
|
if (drmCommandWriteRead(bo->rws->fd,
|
||||||
DRM_RADEON_GEM_MMAP,
|
DRM_RADEON_GEM_MMAP,
|
||||||
&args,
|
&args,
|
||||||
@@ -470,9 +470,9 @@ void *radeon_bo_do_map(struct radeon_bo *bo)
|
|||||||
bo->u.real.map_count = 1;
|
bo->u.real.map_count = 1;
|
||||||
|
|
||||||
if (bo->initial_domain & RADEON_DOMAIN_VRAM)
|
if (bo->initial_domain & RADEON_DOMAIN_VRAM)
|
||||||
bo->rws->mapped_vram += bo->base.base.size;
|
bo->rws->mapped_vram += bo->base.size;
|
||||||
else
|
else
|
||||||
bo->rws->mapped_gtt += bo->base.base.size;
|
bo->rws->mapped_gtt += bo->base.size;
|
||||||
bo->rws->num_mapped_buffers++;
|
bo->rws->num_mapped_buffers++;
|
||||||
|
|
||||||
mtx_unlock(&bo->u.real.map_mutex);
|
mtx_unlock(&bo->u.real.map_mutex);
|
||||||
@@ -480,7 +480,7 @@ void *radeon_bo_do_map(struct radeon_bo *bo)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void *radeon_bo_map(struct radeon_winsys *rws,
|
static void *radeon_bo_map(struct radeon_winsys *rws,
|
||||||
struct pb_buffer *buf,
|
struct pb_buffer_lean *buf,
|
||||||
struct radeon_cmdbuf *rcs,
|
struct radeon_cmdbuf *rcs,
|
||||||
enum pipe_map_flags usage)
|
enum pipe_map_flags usage)
|
||||||
{
|
{
|
||||||
@@ -505,7 +505,7 @@ static void *radeon_bo_map(struct radeon_winsys *rws,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!radeon_bo_wait(rws, (struct pb_buffer*)bo, 0,
|
if (!radeon_bo_wait(rws, (struct pb_buffer_lean*)bo, 0,
|
||||||
RADEON_USAGE_WRITE)) {
|
RADEON_USAGE_WRITE)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -516,7 +516,7 @@ static void *radeon_bo_map(struct radeon_winsys *rws,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!radeon_bo_wait(rws, (struct pb_buffer*)bo, 0,
|
if (!radeon_bo_wait(rws, (struct pb_buffer_lean*)bo, 0,
|
||||||
RADEON_USAGE_READWRITE)) {
|
RADEON_USAGE_READWRITE)) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -536,7 +536,7 @@ static void *radeon_bo_map(struct radeon_winsys *rws,
|
|||||||
cs->flush_cs(cs->flush_data,
|
cs->flush_cs(cs->flush_data,
|
||||||
RADEON_FLUSH_START_NEXT_GFX_IB_NOW, NULL);
|
RADEON_FLUSH_START_NEXT_GFX_IB_NOW, NULL);
|
||||||
}
|
}
|
||||||
radeon_bo_wait(rws, (struct pb_buffer*)bo, OS_TIMEOUT_INFINITE,
|
radeon_bo_wait(rws, (struct pb_buffer_lean*)bo, OS_TIMEOUT_INFINITE,
|
||||||
RADEON_USAGE_WRITE);
|
RADEON_USAGE_WRITE);
|
||||||
} else {
|
} else {
|
||||||
/* Mapping for write. */
|
/* Mapping for write. */
|
||||||
@@ -551,7 +551,7 @@ static void *radeon_bo_map(struct radeon_winsys *rws,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
radeon_bo_wait(rws, (struct pb_buffer*)bo, OS_TIMEOUT_INFINITE,
|
radeon_bo_wait(rws, (struct pb_buffer_lean*)bo, OS_TIMEOUT_INFINITE,
|
||||||
RADEON_USAGE_READWRITE);
|
RADEON_USAGE_READWRITE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -562,7 +562,7 @@ static void *radeon_bo_map(struct radeon_winsys *rws,
|
|||||||
return radeon_bo_do_map(bo);
|
return radeon_bo_do_map(bo);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void radeon_bo_unmap(struct radeon_winsys *rws, struct pb_buffer *_buf)
|
static void radeon_bo_unmap(struct radeon_winsys *rws, struct pb_buffer_lean *_buf)
|
||||||
{
|
{
|
||||||
struct radeon_bo *bo = (struct radeon_bo*)_buf;
|
struct radeon_bo *bo = (struct radeon_bo*)_buf;
|
||||||
|
|
||||||
@@ -584,13 +584,13 @@ static void radeon_bo_unmap(struct radeon_winsys *rws, struct pb_buffer *_buf)
|
|||||||
return; /* it's been mapped multiple times */
|
return; /* it's been mapped multiple times */
|
||||||
}
|
}
|
||||||
|
|
||||||
os_munmap(bo->u.real.ptr, bo->base.base.size);
|
os_munmap(bo->u.real.ptr, bo->base.size);
|
||||||
bo->u.real.ptr = NULL;
|
bo->u.real.ptr = NULL;
|
||||||
|
|
||||||
if (bo->initial_domain & RADEON_DOMAIN_VRAM)
|
if (bo->initial_domain & RADEON_DOMAIN_VRAM)
|
||||||
bo->rws->mapped_vram -= bo->base.base.size;
|
bo->rws->mapped_vram -= bo->base.size;
|
||||||
else
|
else
|
||||||
bo->rws->mapped_gtt -= bo->base.base.size;
|
bo->rws->mapped_gtt -= bo->base.size;
|
||||||
bo->rws->num_mapped_buffers--;
|
bo->rws->num_mapped_buffers--;
|
||||||
|
|
||||||
mtx_unlock(&bo->u.real.map_mutex);
|
mtx_unlock(&bo->u.real.map_mutex);
|
||||||
@@ -645,10 +645,10 @@ static struct radeon_bo *radeon_create_bo(struct radeon_drm_winsys *rws,
|
|||||||
if (!bo)
|
if (!bo)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
pipe_reference_init(&bo->base.base.reference, 1);
|
pipe_reference_init(&bo->base.reference, 1);
|
||||||
bo->base.base.alignment_log2 = util_logbase2(alignment);
|
bo->base.alignment_log2 = util_logbase2(alignment);
|
||||||
bo->base.base.usage = 0;
|
bo->base.usage = 0;
|
||||||
bo->base.base.size = size;
|
bo->base.size = size;
|
||||||
bo->rws = rws;
|
bo->rws = rws;
|
||||||
bo->handle = args.handle;
|
bo->handle = args.handle;
|
||||||
bo->va = 0;
|
bo->va = 0;
|
||||||
@@ -657,7 +657,7 @@ static struct radeon_bo *radeon_create_bo(struct radeon_drm_winsys *rws,
|
|||||||
(void) mtx_init(&bo->u.real.map_mutex, mtx_plain);
|
(void) mtx_init(&bo->u.real.map_mutex, mtx_plain);
|
||||||
|
|
||||||
if (heap >= 0) {
|
if (heap >= 0) {
|
||||||
pb_cache_init_entry(&rws->bo_cache, &bo->u.real.cache_entry, &bo->base.base,
|
pb_cache_init_entry(&rws->bo_cache, &bo->u.real.cache_entry, &bo->base,
|
||||||
heap);
|
heap);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -689,12 +689,12 @@ static struct radeon_bo *radeon_create_bo(struct radeon_drm_winsys *rws,
|
|||||||
fprintf(stderr, "radeon: alignment : %d bytes\n", alignment);
|
fprintf(stderr, "radeon: alignment : %d bytes\n", alignment);
|
||||||
fprintf(stderr, "radeon: domains : %d\n", args.initial_domain);
|
fprintf(stderr, "radeon: domains : %d\n", args.initial_domain);
|
||||||
fprintf(stderr, "radeon: va : 0x%016llx\n", (unsigned long long)bo->va);
|
fprintf(stderr, "radeon: va : 0x%016llx\n", (unsigned long long)bo->va);
|
||||||
radeon_bo_destroy(NULL, &bo->base.base);
|
radeon_bo_destroy(NULL, &bo->base);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
mtx_lock(&rws->bo_handles_mutex);
|
mtx_lock(&rws->bo_handles_mutex);
|
||||||
if (va.operation == RADEON_VA_RESULT_VA_EXIST) {
|
if (va.operation == RADEON_VA_RESULT_VA_EXIST) {
|
||||||
struct pb_buffer *b = &bo->base;
|
struct pb_buffer_lean *b = &bo->base;
|
||||||
struct radeon_bo *old_bo =
|
struct radeon_bo *old_bo =
|
||||||
_mesa_hash_table_u64_search(rws->bo_vas, va.offset);
|
_mesa_hash_table_u64_search(rws->bo_vas, va.offset);
|
||||||
|
|
||||||
@@ -717,22 +717,22 @@ static struct radeon_bo *radeon_create_bo(struct radeon_drm_winsys *rws,
|
|||||||
|
|
||||||
bool radeon_bo_can_reclaim(void *winsys, struct pb_buffer_lean *_buf)
|
bool radeon_bo_can_reclaim(void *winsys, struct pb_buffer_lean *_buf)
|
||||||
{
|
{
|
||||||
struct radeon_bo *bo = radeon_bo((struct pb_buffer*)_buf);
|
struct radeon_bo *bo = radeon_bo((struct pb_buffer_lean*)_buf);
|
||||||
|
|
||||||
if (radeon_bo_is_referenced_by_any_cs(bo))
|
if (radeon_bo_is_referenced_by_any_cs(bo))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return radeon_bo_wait(winsys, (struct pb_buffer*)_buf, 0, RADEON_USAGE_READWRITE);
|
return radeon_bo_wait(winsys, (struct pb_buffer_lean*)_buf, 0, RADEON_USAGE_READWRITE);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool radeon_bo_can_reclaim_slab(void *priv, struct pb_slab_entry *entry)
|
bool radeon_bo_can_reclaim_slab(void *priv, struct pb_slab_entry *entry)
|
||||||
{
|
{
|
||||||
struct radeon_bo *bo = container_of(entry, struct radeon_bo, u.slab.entry);
|
struct radeon_bo *bo = container_of(entry, struct radeon_bo, u.slab.entry);
|
||||||
|
|
||||||
return radeon_bo_can_reclaim(NULL, &bo->base.base);
|
return radeon_bo_can_reclaim(NULL, &bo->base);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void radeon_bo_slab_destroy(void *winsys, struct pb_buffer *_buf)
|
static void radeon_bo_slab_destroy(void *winsys, struct pb_buffer_lean *_buf)
|
||||||
{
|
{
|
||||||
struct radeon_bo *bo = radeon_bo(_buf);
|
struct radeon_bo *bo = radeon_bo(_buf);
|
||||||
|
|
||||||
@@ -762,7 +762,7 @@ struct pb_slab *radeon_bo_slab_alloc(void *priv, unsigned heap,
|
|||||||
|
|
||||||
assert(slab->buffer->handle);
|
assert(slab->buffer->handle);
|
||||||
|
|
||||||
slab->base.num_entries = slab->buffer->base.base.size / entry_size;
|
slab->base.num_entries = slab->buffer->base.size / entry_size;
|
||||||
slab->base.num_free = slab->base.num_entries;
|
slab->base.num_free = slab->base.num_entries;
|
||||||
slab->base.group_index = group_index;
|
slab->base.group_index = group_index;
|
||||||
slab->base.entry_size = entry_size;
|
slab->base.entry_size = entry_size;
|
||||||
@@ -777,9 +777,9 @@ struct pb_slab *radeon_bo_slab_alloc(void *priv, unsigned heap,
|
|||||||
for (unsigned i = 0; i < slab->base.num_entries; ++i) {
|
for (unsigned i = 0; i < slab->base.num_entries; ++i) {
|
||||||
struct radeon_bo *bo = &slab->entries[i];
|
struct radeon_bo *bo = &slab->entries[i];
|
||||||
|
|
||||||
bo->base.base.alignment_log2 = util_logbase2(entry_size);
|
bo->base.alignment_log2 = util_logbase2(entry_size);
|
||||||
bo->base.base.usage = slab->buffer->base.base.usage;
|
bo->base.usage = slab->buffer->base.usage;
|
||||||
bo->base.base.size = entry_size;
|
bo->base.size = entry_size;
|
||||||
bo->rws = ws;
|
bo->rws = ws;
|
||||||
bo->va = slab->buffer->va + i * entry_size;
|
bo->va = slab->buffer->va + i * entry_size;
|
||||||
bo->initial_domain = domains;
|
bo->initial_domain = domains;
|
||||||
@@ -846,7 +846,7 @@ static unsigned eg_tile_split_rev(unsigned eg_tile_split)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void radeon_bo_get_metadata(struct radeon_winsys *rws,
|
static void radeon_bo_get_metadata(struct radeon_winsys *rws,
|
||||||
struct pb_buffer *_buf,
|
struct pb_buffer_lean *_buf,
|
||||||
struct radeon_bo_metadata *md,
|
struct radeon_bo_metadata *md,
|
||||||
struct radeon_surf *surf)
|
struct radeon_surf *surf)
|
||||||
{
|
{
|
||||||
@@ -904,7 +904,7 @@ static void radeon_bo_get_metadata(struct radeon_winsys *rws,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void radeon_bo_set_metadata(struct radeon_winsys *rws,
|
static void radeon_bo_set_metadata(struct radeon_winsys *rws,
|
||||||
struct pb_buffer *_buf,
|
struct pb_buffer_lean *_buf,
|
||||||
struct radeon_bo_metadata *md,
|
struct radeon_bo_metadata *md,
|
||||||
struct radeon_surf *surf)
|
struct radeon_surf *surf)
|
||||||
{
|
{
|
||||||
@@ -974,7 +974,7 @@ static void radeon_bo_set_metadata(struct radeon_winsys *rws,
|
|||||||
sizeof(args));
|
sizeof(args));
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pb_buffer *
|
static struct pb_buffer_lean *
|
||||||
radeon_winsys_bo_create(struct radeon_winsys *rws,
|
radeon_winsys_bo_create(struct radeon_winsys *rws,
|
||||||
uint64_t size,
|
uint64_t size,
|
||||||
unsigned alignment,
|
unsigned alignment,
|
||||||
@@ -1013,7 +1013,7 @@ radeon_winsys_bo_create(struct radeon_winsys *rws,
|
|||||||
|
|
||||||
bo = container_of(entry, struct radeon_bo, u.slab.entry);
|
bo = container_of(entry, struct radeon_bo, u.slab.entry);
|
||||||
|
|
||||||
pipe_reference_init(&bo->base.base.reference, 1);
|
pipe_reference_init(&bo->base.reference, 1);
|
||||||
|
|
||||||
return &bo->base;
|
return &bo->base;
|
||||||
}
|
}
|
||||||
@@ -1034,7 +1034,7 @@ radeon_winsys_bo_create(struct radeon_winsys *rws,
|
|||||||
heap = radeon_get_heap_index(domain, flags & ~RADEON_FLAG_NO_SUBALLOC);
|
heap = radeon_get_heap_index(domain, flags & ~RADEON_FLAG_NO_SUBALLOC);
|
||||||
assert(heap >= 0 && heap < RADEON_NUM_HEAPS);
|
assert(heap >= 0 && heap < RADEON_NUM_HEAPS);
|
||||||
|
|
||||||
bo = radeon_bo((struct pb_buffer*)pb_cache_reclaim_buffer(&ws->bo_cache, size,
|
bo = radeon_bo((struct pb_buffer_lean*)pb_cache_reclaim_buffer(&ws->bo_cache, size,
|
||||||
alignment, 0, heap));
|
alignment, 0, heap));
|
||||||
if (bo)
|
if (bo)
|
||||||
return &bo->base;
|
return &bo->base;
|
||||||
@@ -1060,7 +1060,7 @@ radeon_winsys_bo_create(struct radeon_winsys *rws,
|
|||||||
return &bo->base;
|
return &bo->base;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void radeon_winsys_bo_destroy(struct radeon_winsys *ws, struct pb_buffer *buf)
|
static void radeon_winsys_bo_destroy(struct radeon_winsys *ws, struct pb_buffer_lean *buf)
|
||||||
{
|
{
|
||||||
struct radeon_bo *bo = radeon_bo(buf);
|
struct radeon_bo *bo = radeon_bo(buf);
|
||||||
|
|
||||||
@@ -1070,7 +1070,7 @@ static void radeon_winsys_bo_destroy(struct radeon_winsys *ws, struct pb_buffer
|
|||||||
radeon_bo_slab_destroy(ws, buf);
|
radeon_bo_slab_destroy(ws, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pb_buffer *radeon_winsys_bo_from_ptr(struct radeon_winsys *rws,
|
static struct pb_buffer_lean *radeon_winsys_bo_from_ptr(struct radeon_winsys *rws,
|
||||||
void *pointer, uint64_t size,
|
void *pointer, uint64_t size,
|
||||||
enum radeon_bo_flag flags)
|
enum radeon_bo_flag flags)
|
||||||
{
|
{
|
||||||
@@ -1106,10 +1106,10 @@ static struct pb_buffer *radeon_winsys_bo_from_ptr(struct radeon_winsys *rws,
|
|||||||
mtx_lock(&ws->bo_handles_mutex);
|
mtx_lock(&ws->bo_handles_mutex);
|
||||||
|
|
||||||
/* Initialize it. */
|
/* Initialize it. */
|
||||||
pipe_reference_init(&bo->base.base.reference, 1);
|
pipe_reference_init(&bo->base.reference, 1);
|
||||||
bo->handle = args.handle;
|
bo->handle = args.handle;
|
||||||
bo->base.base.alignment_log2 = 0;
|
bo->base.alignment_log2 = 0;
|
||||||
bo->base.base.size = size;
|
bo->base.size = size;
|
||||||
bo->rws = ws;
|
bo->rws = ws;
|
||||||
bo->user_ptr = pointer;
|
bo->user_ptr = pointer;
|
||||||
bo->va = 0;
|
bo->va = 0;
|
||||||
@@ -1124,7 +1124,7 @@ static struct pb_buffer *radeon_winsys_bo_from_ptr(struct radeon_winsys *rws,
|
|||||||
if (ws->info.r600_has_virtual_memory) {
|
if (ws->info.r600_has_virtual_memory) {
|
||||||
struct drm_radeon_gem_va va;
|
struct drm_radeon_gem_va va;
|
||||||
|
|
||||||
bo->va = radeon_bomgr_find_va64(ws, bo->base.base.size, 1 << 20);
|
bo->va = radeon_bomgr_find_va64(ws, bo->base.size, 1 << 20);
|
||||||
|
|
||||||
va.handle = bo->handle;
|
va.handle = bo->handle;
|
||||||
va.operation = RADEON_VA_MAP;
|
va.operation = RADEON_VA_MAP;
|
||||||
@@ -1137,12 +1137,12 @@ static struct pb_buffer *radeon_winsys_bo_from_ptr(struct radeon_winsys *rws,
|
|||||||
r = drmCommandWriteRead(ws->fd, DRM_RADEON_GEM_VA, &va, sizeof(va));
|
r = drmCommandWriteRead(ws->fd, DRM_RADEON_GEM_VA, &va, sizeof(va));
|
||||||
if (r && va.operation == RADEON_VA_RESULT_ERROR) {
|
if (r && va.operation == RADEON_VA_RESULT_ERROR) {
|
||||||
fprintf(stderr, "radeon: Failed to assign virtual address space\n");
|
fprintf(stderr, "radeon: Failed to assign virtual address space\n");
|
||||||
radeon_bo_destroy(NULL, &bo->base.base);
|
radeon_bo_destroy(NULL, &bo->base);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
mtx_lock(&ws->bo_handles_mutex);
|
mtx_lock(&ws->bo_handles_mutex);
|
||||||
if (va.operation == RADEON_VA_RESULT_VA_EXIST) {
|
if (va.operation == RADEON_VA_RESULT_VA_EXIST) {
|
||||||
struct pb_buffer *b = &bo->base;
|
struct pb_buffer_lean *b = &bo->base;
|
||||||
struct radeon_bo *old_bo =
|
struct radeon_bo *old_bo =
|
||||||
_mesa_hash_table_u64_search(ws->bo_vas, va.offset);
|
_mesa_hash_table_u64_search(ws->bo_vas, va.offset);
|
||||||
|
|
||||||
@@ -1155,12 +1155,12 @@ static struct pb_buffer *radeon_winsys_bo_from_ptr(struct radeon_winsys *rws,
|
|||||||
mtx_unlock(&ws->bo_handles_mutex);
|
mtx_unlock(&ws->bo_handles_mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
ws->allocated_gtt += align(bo->base.base.size, ws->info.gart_page_size);
|
ws->allocated_gtt += align(bo->base.size, ws->info.gart_page_size);
|
||||||
|
|
||||||
return (struct pb_buffer*)bo;
|
return (struct pb_buffer_lean*)bo;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pb_buffer *radeon_winsys_bo_from_handle(struct radeon_winsys *rws,
|
static struct pb_buffer_lean *radeon_winsys_bo_from_handle(struct radeon_winsys *rws,
|
||||||
struct winsys_handle *whandle,
|
struct winsys_handle *whandle,
|
||||||
unsigned vm_alignment,
|
unsigned vm_alignment,
|
||||||
bool is_dri_prime_linear_buffer)
|
bool is_dri_prime_linear_buffer)
|
||||||
@@ -1195,7 +1195,7 @@ static struct pb_buffer *radeon_winsys_bo_from_handle(struct radeon_winsys *rws,
|
|||||||
|
|
||||||
if (bo) {
|
if (bo) {
|
||||||
/* Increase the refcount. */
|
/* Increase the refcount. */
|
||||||
p_atomic_inc(&bo->base.base.reference.count);
|
p_atomic_inc(&bo->base.reference.count);
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1235,9 +1235,9 @@ static struct pb_buffer *radeon_winsys_bo_from_handle(struct radeon_winsys *rws,
|
|||||||
bo->handle = handle;
|
bo->handle = handle;
|
||||||
|
|
||||||
/* Initialize it. */
|
/* Initialize it. */
|
||||||
pipe_reference_init(&bo->base.base.reference, 1);
|
pipe_reference_init(&bo->base.reference, 1);
|
||||||
bo->base.base.alignment_log2 = 0;
|
bo->base.alignment_log2 = 0;
|
||||||
bo->base.base.size = (unsigned) size;
|
bo->base.size = (unsigned) size;
|
||||||
bo->rws = ws;
|
bo->rws = ws;
|
||||||
bo->va = 0;
|
bo->va = 0;
|
||||||
bo->hash = __sync_fetch_and_add(&ws->next_bo_hash, 1);
|
bo->hash = __sync_fetch_and_add(&ws->next_bo_hash, 1);
|
||||||
@@ -1254,7 +1254,7 @@ done:
|
|||||||
if (ws->info.r600_has_virtual_memory && !bo->va) {
|
if (ws->info.r600_has_virtual_memory && !bo->va) {
|
||||||
struct drm_radeon_gem_va va;
|
struct drm_radeon_gem_va va;
|
||||||
|
|
||||||
bo->va = radeon_bomgr_find_va64(ws, bo->base.base.size, vm_alignment);
|
bo->va = radeon_bomgr_find_va64(ws, bo->base.size, vm_alignment);
|
||||||
|
|
||||||
va.handle = bo->handle;
|
va.handle = bo->handle;
|
||||||
va.operation = RADEON_VA_MAP;
|
va.operation = RADEON_VA_MAP;
|
||||||
@@ -1267,12 +1267,12 @@ done:
|
|||||||
r = drmCommandWriteRead(ws->fd, DRM_RADEON_GEM_VA, &va, sizeof(va));
|
r = drmCommandWriteRead(ws->fd, DRM_RADEON_GEM_VA, &va, sizeof(va));
|
||||||
if (r && va.operation == RADEON_VA_RESULT_ERROR) {
|
if (r && va.operation == RADEON_VA_RESULT_ERROR) {
|
||||||
fprintf(stderr, "radeon: Failed to assign virtual address space\n");
|
fprintf(stderr, "radeon: Failed to assign virtual address space\n");
|
||||||
radeon_bo_destroy(NULL, &bo->base.base);
|
radeon_bo_destroy(NULL, &bo->base);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
mtx_lock(&ws->bo_handles_mutex);
|
mtx_lock(&ws->bo_handles_mutex);
|
||||||
if (va.operation == RADEON_VA_RESULT_VA_EXIST) {
|
if (va.operation == RADEON_VA_RESULT_VA_EXIST) {
|
||||||
struct pb_buffer *b = &bo->base;
|
struct pb_buffer_lean *b = &bo->base;
|
||||||
struct radeon_bo *old_bo =
|
struct radeon_bo *old_bo =
|
||||||
_mesa_hash_table_u64_search(ws->bo_vas, va.offset);
|
_mesa_hash_table_u64_search(ws->bo_vas, va.offset);
|
||||||
|
|
||||||
@@ -1288,11 +1288,11 @@ done:
|
|||||||
bo->initial_domain = radeon_bo_get_initial_domain((void*)bo);
|
bo->initial_domain = radeon_bo_get_initial_domain((void*)bo);
|
||||||
|
|
||||||
if (bo->initial_domain & RADEON_DOMAIN_VRAM)
|
if (bo->initial_domain & RADEON_DOMAIN_VRAM)
|
||||||
ws->allocated_vram += align(bo->base.base.size, ws->info.gart_page_size);
|
ws->allocated_vram += align(bo->base.size, ws->info.gart_page_size);
|
||||||
else if (bo->initial_domain & RADEON_DOMAIN_GTT)
|
else if (bo->initial_domain & RADEON_DOMAIN_GTT)
|
||||||
ws->allocated_gtt += align(bo->base.base.size, ws->info.gart_page_size);
|
ws->allocated_gtt += align(bo->base.size, ws->info.gart_page_size);
|
||||||
|
|
||||||
return (struct pb_buffer*)bo;
|
return (struct pb_buffer_lean*)bo;
|
||||||
|
|
||||||
fail:
|
fail:
|
||||||
mtx_unlock(&ws->bo_handles_mutex);
|
mtx_unlock(&ws->bo_handles_mutex);
|
||||||
@@ -1300,7 +1300,7 @@ fail:
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool radeon_winsys_bo_get_handle(struct radeon_winsys *rws,
|
static bool radeon_winsys_bo_get_handle(struct radeon_winsys *rws,
|
||||||
struct pb_buffer *buffer,
|
struct pb_buffer_lean *buffer,
|
||||||
struct winsys_handle *whandle)
|
struct winsys_handle *whandle)
|
||||||
{
|
{
|
||||||
struct drm_gem_flink flink;
|
struct drm_gem_flink flink;
|
||||||
@@ -1340,22 +1340,22 @@ static bool radeon_winsys_bo_get_handle(struct radeon_winsys *rws,
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool radeon_winsys_bo_is_user_ptr(struct pb_buffer *buf)
|
static bool radeon_winsys_bo_is_user_ptr(struct pb_buffer_lean *buf)
|
||||||
{
|
{
|
||||||
return ((struct radeon_bo*)buf)->user_ptr != NULL;
|
return ((struct radeon_bo*)buf)->user_ptr != NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool radeon_winsys_bo_is_suballocated(struct pb_buffer *buf)
|
static bool radeon_winsys_bo_is_suballocated(struct pb_buffer_lean *buf)
|
||||||
{
|
{
|
||||||
return !((struct radeon_bo*)buf)->handle;
|
return !((struct radeon_bo*)buf)->handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint64_t radeon_winsys_bo_va(struct pb_buffer *buf)
|
static uint64_t radeon_winsys_bo_va(struct pb_buffer_lean *buf)
|
||||||
{
|
{
|
||||||
return ((struct radeon_bo*)buf)->va;
|
return ((struct radeon_bo*)buf)->va;
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned radeon_winsys_bo_get_reloc_offset(struct pb_buffer *buf)
|
static unsigned radeon_winsys_bo_get_reloc_offset(struct pb_buffer_lean *buf)
|
||||||
{
|
{
|
||||||
struct radeon_bo *bo = radeon_bo(buf);
|
struct radeon_bo *bo = radeon_bo(buf);
|
||||||
|
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
#include "pipebuffer/pb_slab.h"
|
#include "pipebuffer/pb_slab.h"
|
||||||
|
|
||||||
struct radeon_bo {
|
struct radeon_bo {
|
||||||
struct pb_buffer base;
|
struct pb_buffer_lean base;
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
struct pb_cache_entry cache_entry;
|
struct pb_cache_entry cache_entry;
|
||||||
@@ -70,7 +70,7 @@ static inline void
|
|||||||
radeon_ws_bo_reference(struct radeon_winsys *rws, struct radeon_bo **dst,
|
radeon_ws_bo_reference(struct radeon_winsys *rws, struct radeon_bo **dst,
|
||||||
struct radeon_bo *src)
|
struct radeon_bo *src)
|
||||||
{
|
{
|
||||||
radeon_bo_reference(rws, (struct pb_buffer**)dst, (struct pb_buffer*)src);
|
radeon_bo_reference(rws, (struct pb_buffer_lean**)dst, (struct pb_buffer_lean*)src);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *radeon_bo_do_map(struct radeon_bo *bo);
|
void *radeon_bo_do_map(struct radeon_bo *bo);
|
||||||
|
|||||||
@@ -373,7 +373,7 @@ static int radeon_lookup_or_add_slab_buffer(struct radeon_drm_cs *cs,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static unsigned radeon_drm_cs_add_buffer(struct radeon_cmdbuf *rcs,
|
static unsigned radeon_drm_cs_add_buffer(struct radeon_cmdbuf *rcs,
|
||||||
struct pb_buffer *buf,
|
struct pb_buffer_lean *buf,
|
||||||
unsigned usage,
|
unsigned usage,
|
||||||
enum radeon_bo_domain domains)
|
enum radeon_bo_domain domains)
|
||||||
{
|
{
|
||||||
@@ -415,15 +415,15 @@ static unsigned radeon_drm_cs_add_buffer(struct radeon_cmdbuf *rcs,
|
|||||||
cs->csc->relocs_bo[index].u.real.priority_usage |= priority;
|
cs->csc->relocs_bo[index].u.real.priority_usage |= priority;
|
||||||
|
|
||||||
if (added_domains & RADEON_DOMAIN_VRAM)
|
if (added_domains & RADEON_DOMAIN_VRAM)
|
||||||
rcs->used_vram_kb += bo->base.base.size / 1024;
|
rcs->used_vram_kb += bo->base.size / 1024;
|
||||||
else if (added_domains & RADEON_DOMAIN_GTT)
|
else if (added_domains & RADEON_DOMAIN_GTT)
|
||||||
rcs->used_gart_kb += bo->base.base.size / 1024;
|
rcs->used_gart_kb += bo->base.size / 1024;
|
||||||
|
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int radeon_drm_cs_lookup_buffer(struct radeon_cmdbuf *rcs,
|
static int radeon_drm_cs_lookup_buffer(struct radeon_cmdbuf *rcs,
|
||||||
struct pb_buffer *buf)
|
struct pb_buffer_lean *buf)
|
||||||
{
|
{
|
||||||
struct radeon_drm_cs *cs = radeon_drm_cs(rcs);
|
struct radeon_drm_cs *cs = radeon_drm_cs(rcs);
|
||||||
|
|
||||||
@@ -483,7 +483,7 @@ static unsigned radeon_drm_cs_get_buffer_list(struct radeon_cmdbuf *rcs,
|
|||||||
|
|
||||||
if (list) {
|
if (list) {
|
||||||
for (i = 0; i < cs->csc->num_relocs; i++) {
|
for (i = 0; i < cs->csc->num_relocs; i++) {
|
||||||
list[i].bo_size = cs->csc->relocs_bo[i].bo->base.base.size;
|
list[i].bo_size = cs->csc->relocs_bo[i].bo->base.size;
|
||||||
list[i].vm_address = cs->csc->relocs_bo[i].bo->va;
|
list[i].vm_address = cs->csc->relocs_bo[i].bo->va;
|
||||||
list[i].priority_usage = cs->csc->relocs_bo[i].u.real.priority_usage;
|
list[i].priority_usage = cs->csc->relocs_bo[i].u.real.priority_usage;
|
||||||
}
|
}
|
||||||
@@ -766,7 +766,7 @@ static void radeon_drm_cs_destroy(struct radeon_cmdbuf *rcs)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static bool radeon_bo_is_referenced(struct radeon_cmdbuf *rcs,
|
static bool radeon_bo_is_referenced(struct radeon_cmdbuf *rcs,
|
||||||
struct pb_buffer *_buf,
|
struct pb_buffer_lean *_buf,
|
||||||
unsigned usage)
|
unsigned usage)
|
||||||
{
|
{
|
||||||
struct radeon_drm_cs *cs = radeon_drm_cs(rcs);
|
struct radeon_drm_cs *cs = radeon_drm_cs(rcs);
|
||||||
@@ -796,7 +796,7 @@ static bool radeon_bo_is_referenced(struct radeon_cmdbuf *rcs,
|
|||||||
static struct pipe_fence_handle *radeon_cs_create_fence(struct radeon_cmdbuf *rcs)
|
static struct pipe_fence_handle *radeon_cs_create_fence(struct radeon_cmdbuf *rcs)
|
||||||
{
|
{
|
||||||
struct radeon_drm_cs *cs = radeon_drm_cs(rcs);
|
struct radeon_drm_cs *cs = radeon_drm_cs(rcs);
|
||||||
struct pb_buffer *fence;
|
struct pb_buffer_lean *fence;
|
||||||
|
|
||||||
/* Create a fence, which is a dummy BO. */
|
/* Create a fence, which is a dummy BO. */
|
||||||
fence = cs->ws->base.buffer_create(&cs->ws->base, 1, 1,
|
fence = cs->ws->base.buffer_create(&cs->ws->base, 1, 1,
|
||||||
@@ -816,7 +816,7 @@ static bool radeon_fence_wait(struct radeon_winsys *ws,
|
|||||||
struct pipe_fence_handle *fence,
|
struct pipe_fence_handle *fence,
|
||||||
uint64_t timeout)
|
uint64_t timeout)
|
||||||
{
|
{
|
||||||
return ws->buffer_wait(ws, (struct pb_buffer*)fence, timeout,
|
return ws->buffer_wait(ws, (struct pb_buffer_lean*)fence, timeout,
|
||||||
RADEON_USAGE_READWRITE);
|
RADEON_USAGE_READWRITE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -824,7 +824,7 @@ static void radeon_fence_reference(struct radeon_winsys *ws,
|
|||||||
struct pipe_fence_handle **dst,
|
struct pipe_fence_handle **dst,
|
||||||
struct pipe_fence_handle *src)
|
struct pipe_fence_handle *src)
|
||||||
{
|
{
|
||||||
radeon_bo_reference(ws, (struct pb_buffer**)dst, (struct pb_buffer*)src);
|
radeon_bo_reference(ws, (struct pb_buffer_lean**)dst, (struct pb_buffer_lean*)src);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct pipe_fence_handle *radeon_drm_cs_get_next_fence(struct radeon_cmdbuf *rcs)
|
static struct pipe_fence_handle *radeon_drm_cs_get_next_fence(struct radeon_cmdbuf *rcs)
|
||||||
|
|||||||
Reference in New Issue
Block a user