summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gallium/auxiliary/vl/vl_context.c9
-rw-r--r--src/gallium/auxiliary/vl/vl_mpeg12_decoder.c6
-rw-r--r--src/gallium/auxiliary/vl/vl_video_buffer.c14
-rw-r--r--src/gallium/auxiliary/vl/vl_video_buffer.h1
-rw-r--r--src/gallium/include/pipe/p_video_context.h1
-rw-r--r--src/gallium/state_trackers/vdpau/surface.c7
-rw-r--r--src/gallium/state_trackers/xorg/xvmc/surface.c7
7 files changed, 28 insertions, 17 deletions
diff --git a/src/gallium/auxiliary/vl/vl_context.c b/src/gallium/auxiliary/vl/vl_context.c
index 2bc027fedc5..ba732548732 100644
--- a/src/gallium/auxiliary/vl/vl_context.c
+++ b/src/gallium/auxiliary/vl/vl_context.c
@@ -199,15 +199,10 @@ vl_context_create_decoder(struct pipe_video_context *context,
static struct pipe_video_buffer *
vl_context_create_buffer(struct pipe_video_context *context,
enum pipe_format buffer_format,
+ enum pipe_format resource_formats[3],
enum pipe_video_chroma_format chroma_format,
unsigned width, unsigned height)
{
- const enum pipe_format resource_formats[3] = {
- PIPE_FORMAT_R8_SNORM,
- PIPE_FORMAT_R8_SNORM,
- PIPE_FORMAT_R8_SNORM
- };
-
struct vl_context *ctx = (struct vl_context*)context;
struct pipe_video_buffer *result;
unsigned buffer_width, buffer_height;
@@ -221,7 +216,7 @@ vl_context_create_buffer(struct pipe_video_context *context,
result = vl_video_buffer_init(context, ctx->pipe,
buffer_width, buffer_height, 1,
- chroma_format, 3,
+ chroma_format,
resource_formats,
PIPE_USAGE_STATIC);
if (result) // TODO move format handling into vl_video_buffer
diff --git a/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c b/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c
index 40a1b74f654..ce0393848e3 100644
--- a/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c
+++ b/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c
@@ -309,7 +309,7 @@ init_idct_buffer(struct vl_mpeg12_buffer *buffer)
formats[0] = formats[1] = formats[2] = dec->idct_source_format;
buffer->idct_source = vl_video_buffer_init(dec->base.context, dec->pipe,
dec->base.width / 4, dec->base.height, 1,
- dec->base.chroma_format, 3,
+ dec->base.chroma_format,
formats, PIPE_USAGE_STREAM);
if (!buffer->idct_source)
goto error_source;
@@ -318,7 +318,7 @@ init_idct_buffer(struct vl_mpeg12_buffer *buffer)
buffer->idct_intermediate = vl_video_buffer_init(dec->base.context, dec->pipe,
dec->base.width / dec->nr_of_idct_render_targets,
dec->base.height / 4, dec->nr_of_idct_render_targets,
- dec->base.chroma_format, 3,
+ dec->base.chroma_format,
formats, PIPE_USAGE_STATIC);
if (!buffer->idct_intermediate)
@@ -395,7 +395,7 @@ vl_mpeg12_create_buffer(struct pipe_video_decoder *decoder)
formats[0] = formats[1] = formats[2] =dec->mc_source_format;
buffer->mc_source = vl_video_buffer_init(dec->base.context, dec->pipe,
dec->base.width, dec->base.height, 1,
- dec->base.chroma_format, 3,
+ dec->base.chroma_format,
formats, PIPE_USAGE_STATIC);
if (!buffer->mc_source)
diff --git a/src/gallium/auxiliary/vl/vl_video_buffer.c b/src/gallium/auxiliary/vl/vl_video_buffer.c
index b1d8fd85dcd..dad8dd2c9ae 100644
--- a/src/gallium/auxiliary/vl/vl_video_buffer.c
+++ b/src/gallium/auxiliary/vl/vl_video_buffer.c
@@ -133,7 +133,6 @@ vl_video_buffer_init(struct pipe_video_context *context,
struct pipe_context *pipe,
unsigned width, unsigned height, unsigned depth,
enum pipe_video_chroma_format chroma_format,
- unsigned num_planes,
const enum pipe_format resource_formats[VL_MAX_PLANES],
unsigned usage)
{
@@ -142,7 +141,6 @@ vl_video_buffer_init(struct pipe_video_context *context,
unsigned i;
assert(context && pipe);
- assert(num_planes > 0 && num_planes <= VL_MAX_PLANES);
buffer = CALLOC_STRUCT(vl_video_buffer);
@@ -150,7 +148,7 @@ vl_video_buffer_init(struct pipe_video_context *context,
buffer->base.get_sampler_views = vl_video_buffer_sampler_views;
buffer->base.get_surfaces = vl_video_buffer_surfaces;
buffer->pipe = pipe;
- buffer->num_planes = num_planes;
+ buffer->num_planes = 1;
memset(&templ, 0, sizeof(templ));
templ.target = depth > 1 ? PIPE_TEXTURE_3D : PIPE_TEXTURE_2D;
@@ -166,10 +164,12 @@ vl_video_buffer_init(struct pipe_video_context *context,
if (!buffer->resources[0])
goto error;
- if (num_planes == 1) {
+ if (resource_formats[1] == PIPE_FORMAT_NONE) {
assert(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) {
@@ -183,8 +183,10 @@ vl_video_buffer_init(struct pipe_video_context *context,
if (!buffer->resources[1])
goto error;
- if (num_planes == 2)
+ if (resource_formats[2] == PIPE_FORMAT_NONE)
return &buffer->base;
+ else
+ buffer->num_planes = 3;
templ.format = resource_formats[2];
buffer->resources[2] = pipe->screen->resource_create(pipe->screen, &templ);
diff --git a/src/gallium/auxiliary/vl/vl_video_buffer.h b/src/gallium/auxiliary/vl/vl_video_buffer.h
index 3f462acc510..f5c424cf296 100644
--- a/src/gallium/auxiliary/vl/vl_video_buffer.h
+++ b/src/gallium/auxiliary/vl/vl_video_buffer.h
@@ -56,7 +56,6 @@ vl_video_buffer_init(struct pipe_video_context *context,
struct pipe_context *pipe,
unsigned width, unsigned height, unsigned depth,
enum pipe_video_chroma_format chroma_format,
- unsigned num_planes,
const enum pipe_format resource_formats[VL_MAX_PLANES],
unsigned usage);
#endif /* vl_ycbcr_buffer_h */
diff --git a/src/gallium/include/pipe/p_video_context.h b/src/gallium/include/pipe/p_video_context.h
index 21d0581226d..22203b66d6f 100644
--- a/src/gallium/include/pipe/p_video_context.h
+++ b/src/gallium/include/pipe/p_video_context.h
@@ -121,6 +121,7 @@ struct pipe_video_context
*/
struct pipe_video_buffer *(*create_buffer)(struct pipe_video_context *context,
enum pipe_format buffer_format,
+ enum pipe_format resource_formats[3],
enum pipe_video_chroma_format chroma_format,
unsigned width, unsigned height);
diff --git a/src/gallium/state_trackers/vdpau/surface.c b/src/gallium/state_trackers/vdpau/surface.c
index f0aafae79b5..2b1eb047141 100644
--- a/src/gallium/state_trackers/vdpau/surface.c
+++ b/src/gallium/state_trackers/vdpau/surface.c
@@ -41,6 +41,12 @@ vlVdpVideoSurfaceCreate(VdpDevice device, VdpChromaType chroma_type,
uint32_t width, uint32_t height,
VdpVideoSurface *surface)
{
+ const enum pipe_format resource_formats[3] = {
+ PIPE_FORMAT_R8_UNORM,
+ PIPE_FORMAT_R8_UNORM,
+ PIPE_FORMAT_R8_UNORM
+ };
+
vlVdpSurface *p_surf;
VdpStatus ret;
@@ -71,6 +77,7 @@ vlVdpVideoSurfaceCreate(VdpDevice device, VdpChromaType chroma_type,
p_surf->device = dev;
p_surf->video_buffer = dev->context->vpipe->create_buffer(dev->context->vpipe,
PIPE_FORMAT_YV12, // most common used
+ resource_formats,
ChromaToPipe(chroma_type),
width, height);
diff --git a/src/gallium/state_trackers/xorg/xvmc/surface.c b/src/gallium/state_trackers/xorg/xvmc/surface.c
index 68d003e470a..10701856223 100644
--- a/src/gallium/state_trackers/xorg/xvmc/surface.c
+++ b/src/gallium/state_trackers/xorg/xvmc/surface.c
@@ -197,6 +197,12 @@ unmap_and_flush_surface(XvMCSurfacePrivate *surface)
PUBLIC
Status XvMCCreateSurface(Display *dpy, XvMCContext *context, XvMCSurface *surface)
{
+ const enum pipe_format resource_formats[3] = {
+ PIPE_FORMAT_R8_SNORM,
+ PIPE_FORMAT_R8_SNORM,
+ PIPE_FORMAT_R8_SNORM
+ };
+
XvMCContextPrivate *context_priv;
struct pipe_video_context *vpipe;
XvMCSurfacePrivate *surface_priv;
@@ -219,6 +225,7 @@ Status XvMCCreateSurface(Display *dpy, XvMCContext *context, XvMCSurface *surfac
surface_priv->decode_buffer = context_priv->decoder->create_buffer(context_priv->decoder);
surface_priv->video_buffer = vpipe->create_buffer(vpipe, PIPE_FORMAT_YV12, //TODO
+ resource_formats,
context_priv->decoder->chroma_format,
context_priv->decoder->width,
context_priv->decoder->height);