summaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary/vl
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/auxiliary/vl')
-rw-r--r--src/gallium/auxiliary/vl/vl_mpeg12_decoder.c27
-rw-r--r--src/gallium/auxiliary/vl/vl_video_buffer.c47
-rw-r--r--src/gallium/auxiliary/vl/vl_video_buffer.h9
3 files changed, 43 insertions, 40 deletions
diff --git a/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c b/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c
index cb55fa6f611..6341cc1b218 100644
--- a/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c
+++ b/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c
@@ -909,6 +909,7 @@ init_idct(struct vl_mpeg12_decoder *dec, const struct format_config* format_conf
{
unsigned nr_of_idct_render_targets, max_inst;
enum pipe_format formats[3];
+ struct pipe_video_buffer templat;
struct pipe_sampler_view *matrix = NULL;
@@ -930,21 +931,28 @@ init_idct(struct vl_mpeg12_decoder *dec, const struct format_config* format_conf
nr_of_idct_render_targets = 1;
formats[0] = formats[1] = formats[2] = format_config->idct_source_format;
+ memset(&templat, 0, sizeof(templat));
+ templat.width = dec->base.width / 4;
+ templat.height = dec->base.height;
+ templat.chroma_format = dec->base.chroma_format;
dec->idct_source = vl_video_buffer_create_ex
(
- dec->base.context, dec->base.width / 4, dec->base.height, 1,
- dec->base.chroma_format, formats, PIPE_USAGE_STATIC
+ dec->base.context, &templat,
+ formats, 1, PIPE_USAGE_STATIC
);
if (!dec->idct_source)
goto error_idct_source;
formats[0] = formats[1] = formats[2] = format_config->mc_source_format;
+ memset(&templat, 0, sizeof(templat));
+ templat.width = dec->base.width / nr_of_idct_render_targets;
+ templat.height = dec->base.height / 4;
+ templat.chroma_format = dec->base.chroma_format;
dec->mc_source = vl_video_buffer_create_ex
(
- dec->base.context, dec->base.width / nr_of_idct_render_targets,
- dec->base.height / 4, nr_of_idct_render_targets,
- dec->base.chroma_format, formats, PIPE_USAGE_STATIC
+ dec->base.context, &templat,
+ formats, nr_of_idct_render_targets, PIPE_USAGE_STATIC
);
if (!dec->mc_source)
@@ -985,12 +993,17 @@ static bool
init_mc_source_widthout_idct(struct vl_mpeg12_decoder *dec, const struct format_config* format_config)
{
enum pipe_format formats[3];
+ struct pipe_video_buffer templat;
formats[0] = formats[1] = formats[2] = format_config->mc_source_format;
+ memset(&templat, 0, sizeof(templat));
+ templat.width = dec->base.width;
+ templat.height = dec->base.height;
+ templat.chroma_format = dec->base.chroma_format;
dec->mc_source = vl_video_buffer_create_ex
(
- dec->base.context, dec->base.width, dec->base.height, 1,
- dec->base.chroma_format, formats, PIPE_USAGE_STATIC
+ dec->base.context, &templat,
+ formats, 1, PIPE_USAGE_STATIC
);
return dec->mc_source != NULL;
diff --git a/src/gallium/auxiliary/vl/vl_video_buffer.c b/src/gallium/auxiliary/vl/vl_video_buffer.c
index 8ceb7138479..29d910e69e5 100644
--- a/src/gallium/auxiliary/vl/vl_video_buffer.c
+++ b/src/gallium/auxiliary/vl/vl_video_buffer.c
@@ -253,17 +253,14 @@ error:
struct pipe_video_buffer *
vl_video_buffer_create(struct pipe_context *pipe,
- enum pipe_format buffer_format,
- enum pipe_video_chroma_format chroma_format,
- unsigned width, unsigned height)
+ const struct pipe_video_buffer *tmpl)
{
const enum pipe_format *resource_formats;
- struct pipe_video_buffer *result;
- unsigned buffer_width, buffer_height;
+ struct pipe_video_buffer templat;
bool pot_buffers;
assert(pipe);
- assert(width > 0 && height > 0);
+ assert(tmpl->width > 0 && tmpl->height > 0);
pot_buffers = !pipe->screen->get_video_param
(
@@ -272,30 +269,28 @@ vl_video_buffer_create(struct pipe_context *pipe,
PIPE_VIDEO_CAP_NPOT_TEXTURES
);
- resource_formats = vl_video_buffer_formats(pipe->screen, buffer_format);
+ resource_formats = vl_video_buffer_formats(pipe->screen, tmpl->buffer_format);
if (!resource_formats)
return NULL;
- buffer_width = pot_buffers ? util_next_power_of_two(width) : align(width, MACROBLOCK_WIDTH);
- buffer_height = pot_buffers ? util_next_power_of_two(height) : align(height, MACROBLOCK_HEIGHT);
+ templat = *tmpl;
+ templat.width = pot_buffers ? util_next_power_of_two(tmpl->width)
+ : align(tmpl->width, MACROBLOCK_WIDTH);
+ templat.height = pot_buffers ? util_next_power_of_two(tmpl->height)
+ : align(tmpl->height, MACROBLOCK_HEIGHT);
- result = vl_video_buffer_create_ex
+ return vl_video_buffer_create_ex
(
- pipe, buffer_width, buffer_height, 1,
- chroma_format, resource_formats, PIPE_USAGE_STATIC
+ pipe, &templat, resource_formats,
+ 1, PIPE_USAGE_STATIC
);
- if (result)
- result->buffer_format = buffer_format;
-
- return result;
}
struct pipe_video_buffer *
vl_video_buffer_create_ex(struct pipe_context *pipe,
- unsigned width, unsigned height, unsigned depth,
- enum pipe_video_chroma_format chroma_format,
+ const struct pipe_video_buffer *tmpl,
const enum pipe_format resource_formats[VL_MAX_PLANES],
- unsigned usage)
+ unsigned depth, unsigned usage)
{
struct vl_video_buffer *buffer;
struct pipe_resource templ;
@@ -305,21 +300,19 @@ vl_video_buffer_create_ex(struct pipe_context *pipe,
buffer = CALLOC_STRUCT(vl_video_buffer);
+ buffer->base = *tmpl;
buffer->base.context = pipe;
buffer->base.destroy = vl_video_buffer_destroy;
buffer->base.get_sampler_view_planes = vl_video_buffer_sampler_view_planes;
buffer->base.get_sampler_view_components = vl_video_buffer_sampler_view_components;
buffer->base.get_surfaces = vl_video_buffer_surfaces;
- buffer->base.chroma_format = chroma_format;
- buffer->base.width = width;
- buffer->base.height = height;
buffer->num_planes = 1;
memset(&templ, 0, sizeof(templ));
templ.target = depth > 1 ? PIPE_TEXTURE_3D : PIPE_TEXTURE_2D;
templ.format = resource_formats[0];
- templ.width0 = width;
- templ.height0 = height;
+ templ.width0 = tmpl->width;
+ templ.height0 = tmpl->height;
templ.depth0 = depth;
templ.array_size = 1;
templ.bind = PIPE_BIND_SAMPLER_VIEW | PIPE_BIND_RENDER_TARGET;
@@ -330,17 +323,17 @@ vl_video_buffer_create_ex(struct pipe_context *pipe,
goto error;
if (resource_formats[1] == PIPE_FORMAT_NONE) {
- assert(chroma_format == PIPE_VIDEO_CHROMA_FORMAT_444);
+ assert(tmpl->chroma_format == PIPE_VIDEO_CHROMA_FORMAT_444);
assert(resource_formats[2] == PIPE_FORMAT_NONE);
return &buffer->base;
} else
buffer->num_planes = 2;
templ.format = resource_formats[1];
- if (chroma_format == PIPE_VIDEO_CHROMA_FORMAT_420) {
+ if (tmpl->chroma_format == PIPE_VIDEO_CHROMA_FORMAT_420) {
templ.width0 /= 2;
templ.height0 /= 2;
- } else if (chroma_format == PIPE_VIDEO_CHROMA_FORMAT_422) {
+ } else if (tmpl->chroma_format == PIPE_VIDEO_CHROMA_FORMAT_422) {
templ.height0 /= 2;
}
diff --git a/src/gallium/auxiliary/vl/vl_video_buffer.h b/src/gallium/auxiliary/vl/vl_video_buffer.h
index e096ccdaac2..e0e29b20f31 100644
--- a/src/gallium/auxiliary/vl/vl_video_buffer.h
+++ b/src/gallium/auxiliary/vl/vl_video_buffer.h
@@ -90,18 +90,15 @@ vl_video_buffer_get_associated_data(struct pipe_video_buffer *vbuf,
*/
struct pipe_video_buffer *
vl_video_buffer_create(struct pipe_context *pipe,
- enum pipe_format buffer_format,
- enum pipe_video_chroma_format chroma_format,
- unsigned width, unsigned height);
+ const struct pipe_video_buffer *templat);
/**
* extended create function, gets depth, usage and formats for each plane seperately
*/
struct pipe_video_buffer *
vl_video_buffer_create_ex(struct pipe_context *pipe,
- unsigned width, unsigned height, unsigned depth,
- enum pipe_video_chroma_format chroma_format,
+ const struct pipe_video_buffer *templat,
const enum pipe_format resource_formats[VL_MAX_PLANES],
- unsigned usage);
+ unsigned depth, unsigned usage);
#endif /* vl_video_buffer_h */