We still need the option for handling 3D textures as well.
Should fix: https://bugs.freedesktop.org/show_bug.cgi?id=64143
Signed-off-by: Christian König <christian.koenig@amd.com>
dec->idct_source = vl_video_buffer_create_ex
(
dec->base.context, &templat,
- formats, 1, PIPE_USAGE_STATIC
+ formats, 1, 1, PIPE_USAGE_STATIC
);
if (!dec->idct_source)
dec->mc_source = vl_video_buffer_create_ex
(
dec->base.context, &templat,
- formats, nr_of_idct_render_targets, PIPE_USAGE_STATIC
+ formats, nr_of_idct_render_targets, 1, PIPE_USAGE_STATIC
);
if (!dec->mc_source)
dec->mc_source = vl_video_buffer_create_ex
(
dec->base.context, &templat,
- formats, 1, PIPE_USAGE_STATIC
+ formats, 1, 1, PIPE_USAGE_STATIC
);
return dec->mc_source != NULL;
vl_video_buffer_template(struct pipe_resource *templ,
const struct pipe_video_buffer *tmpl,
enum pipe_format resource_format,
- unsigned array_size, unsigned usage,
- unsigned plane)
+ unsigned depth, unsigned array_size,
+ unsigned usage, unsigned plane)
{
memset(templ, 0, sizeof(*templ));
- templ->target = array_size > 1 ? PIPE_TEXTURE_2D_ARRAY : PIPE_TEXTURE_2D;
+ if (depth > 1)
+ templ->target = PIPE_TEXTURE_3D;
+ else if (array_size > 1)
+ templ->target = PIPE_TEXTURE_2D_ARRAY;
+ else
+ templ->target = PIPE_TEXTURE_2D;
templ->format = resource_format;
templ->width0 = tmpl->width;
templ->height0 = tmpl->height;
- templ->depth0 = 1;
+ templ->depth0 = depth;
templ->array_size = array_size;
templ->bind = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET;
templ->usage = usage;
result = vl_video_buffer_create_ex
(
pipe, &templat, resource_formats,
- tmpl->interlaced ? 2 : 1, PIPE_USAGE_STATIC
+ 1, tmpl->interlaced ? 2 : 1, PIPE_USAGE_STATIC
);
vl_video_buffer_create_ex(struct pipe_context *pipe,
const struct pipe_video_buffer *tmpl,
const enum pipe_format resource_formats[VL_NUM_COMPONENTS],
- unsigned array_size, unsigned usage)
+ unsigned depth, unsigned array_size, unsigned usage)
{
struct pipe_resource res_tmpl;
struct pipe_resource *resources[VL_NUM_COMPONENTS];
memset(resources, 0, sizeof resources);
- vl_video_buffer_template(&res_tmpl, tmpl, resource_formats[0], array_size, usage, 0);
+ vl_video_buffer_template(&res_tmpl, tmpl, resource_formats[0], depth, array_size, usage, 0);
resources[0] = pipe->screen->resource_create(pipe->screen, &res_tmpl);
if (!resources[0])
goto error;
return vl_video_buffer_create_ex2(pipe, tmpl, resources);
}
- vl_video_buffer_template(&res_tmpl, tmpl, resource_formats[1], array_size, usage, 1);
+ vl_video_buffer_template(&res_tmpl, tmpl, resource_formats[1], depth, array_size, usage, 1);
resources[1] = pipe->screen->resource_create(pipe->screen, &res_tmpl);
if (!resources[1])
goto error;
if (resource_formats[2] == PIPE_FORMAT_NONE)
return vl_video_buffer_create_ex2(pipe, tmpl, resources);
- vl_video_buffer_template(&res_tmpl, tmpl, resource_formats[2], array_size, usage, 2);
+ vl_video_buffer_template(&res_tmpl, tmpl, resource_formats[2], depth, array_size, usage, 2);
resources[2] = pipe->screen->resource_create(pipe->screen, &res_tmpl);
if (!resources[2])
goto error;
vl_video_buffer_template(struct pipe_resource *templ,
const struct pipe_video_buffer *templat,
enum pipe_format resource_format,
- unsigned array_size, unsigned usage,
- unsigned plane);
+ unsigned depth, unsigned array_size,
+ unsigned usage, unsigned plane);
/**
* creates a video buffer, can be used as a standard implementation for pipe->create_video_buffer
const struct pipe_video_buffer *templat);
/**
- * extended create function, gets array_size, usage and formats for each plane seperately
+ * extended create function, gets depth, array_size, usage and formats for each plane seperately
*/
struct pipe_video_buffer *
vl_video_buffer_create_ex(struct pipe_context *pipe,
const struct pipe_video_buffer *templat,
const enum pipe_format resource_formats[VL_NUM_COMPONENTS],
- unsigned array_size, unsigned usage);
+ unsigned depth, unsigned array_size, unsigned usage);
/**
* even more extended create function, provide the pipe_resource for each plane
template.width = align(tmpl->width, VL_MACROBLOCK_WIDTH);
template.height = align(tmpl->height / array_size, VL_MACROBLOCK_HEIGHT);
- vl_video_buffer_template(&templ, &template, resource_formats[0], array_size, PIPE_USAGE_STATIC, 0);
+ vl_video_buffer_template(&templ, &template, resource_formats[0], 1, array_size, PIPE_USAGE_STATIC, 0);
if (ctx->chip_class < EVERGREEN)
templ.flags = R600_RESOURCE_FLAG_TRANSFER;
resources[0] = (struct r600_texture *)
goto error;
if (resource_formats[1] != PIPE_FORMAT_NONE) {
- vl_video_buffer_template(&templ, &template, resource_formats[1], array_size, PIPE_USAGE_STATIC, 1);
+ vl_video_buffer_template(&templ, &template, resource_formats[1], 1, array_size, PIPE_USAGE_STATIC, 1);
if (ctx->chip_class < EVERGREEN)
templ.flags = R600_RESOURCE_FLAG_TRANSFER;
resources[1] = (struct r600_texture *)
}
if (resource_formats[2] != PIPE_FORMAT_NONE) {
- vl_video_buffer_template(&templ, &template, resource_formats[2], array_size, PIPE_USAGE_STATIC, 2);
+ vl_video_buffer_template(&templ, &template, resource_formats[2], 1, array_size, PIPE_USAGE_STATIC, 2);
if (ctx->chip_class < EVERGREEN)
templ.flags = R600_RESOURCE_FLAG_TRANSFER;
resources[2] = (struct r600_texture *)
template.width = align(tmpl->width, VL_MACROBLOCK_WIDTH);
template.height = align(tmpl->height / array_size, VL_MACROBLOCK_HEIGHT);
- vl_video_buffer_template(&templ, &template, resource_formats[0], array_size, PIPE_USAGE_STATIC, 0);
+ vl_video_buffer_template(&templ, &template, resource_formats[0], 1, array_size, PIPE_USAGE_STATIC, 0);
/* TODO: Setting the transfer flag is only a workaround till we get tiling working */
templ.flags = R600_RESOURCE_FLAG_TRANSFER;
resources[0] = (struct r600_resource_texture *)
goto error;
if (resource_formats[1] != PIPE_FORMAT_NONE) {
- vl_video_buffer_template(&templ, &template, resource_formats[1], array_size, PIPE_USAGE_STATIC, 1);
+ vl_video_buffer_template(&templ, &template, resource_formats[1], 1, array_size, PIPE_USAGE_STATIC, 1);
templ.flags = R600_RESOURCE_FLAG_TRANSFER;
resources[1] = (struct r600_resource_texture *)
pipe->screen->resource_create(pipe->screen, &templ);
}
if (resource_formats[2] != PIPE_FORMAT_NONE) {
- vl_video_buffer_template(&templ, &template, resource_formats[2], array_size, PIPE_USAGE_STATIC, 2);
+ vl_video_buffer_template(&templ, &template, resource_formats[2], 1, array_size, PIPE_USAGE_STATIC, 2);
templ.flags = R600_RESOURCE_FLAG_TRANSFER;
resources[2] = (struct r600_resource_texture *)
pipe->screen->resource_create(pipe->screen, &templ);