summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gallium/auxiliary/vl/vl_context.c50
-rw-r--r--src/gallium/auxiliary/vl/vl_video_buffer.c27
-rw-r--r--src/gallium/auxiliary/vl/vl_video_buffer.h6
-rw-r--r--src/gallium/include/pipe/p_video_context.h5
4 files changed, 55 insertions, 33 deletions
diff --git a/src/gallium/auxiliary/vl/vl_context.c b/src/gallium/auxiliary/vl/vl_context.c
index e4805eae98c..e3aa49d2856 100644
--- a/src/gallium/auxiliary/vl/vl_context.c
+++ b/src/gallium/auxiliary/vl/vl_context.c
@@ -35,18 +35,6 @@
#include "vl_compositor.h"
#include "vl_mpeg12_decoder.h"
-const enum pipe_format const_resource_formats_YV12[3] = {
- PIPE_FORMAT_R8_UNORM,
- PIPE_FORMAT_R8_UNORM,
- PIPE_FORMAT_R8_UNORM
-};
-
-const enum pipe_format const_resource_formats_NV12[3] = {
- PIPE_FORMAT_R8_UNORM,
- PIPE_FORMAT_R8G8_UNORM,
- PIPE_FORMAT_NONE
-};
-
static void
vl_context_destroy(struct pipe_video_context *context)
{
@@ -76,15 +64,28 @@ vl_context_get_param(struct pipe_video_context *context, int param)
static boolean
vl_context_is_format_supported(struct pipe_video_context *context,
enum pipe_format format,
- unsigned usage)
+ enum pipe_video_profile profile)
{
struct vl_context *ctx = (struct vl_context*)context;
+ const enum pipe_format *resource_formats;
+ unsigned i;
assert(context);
- return ctx->pipe->screen->is_format_supported(ctx->pipe->screen, format,
- PIPE_TEXTURE_2D,
- 0, usage);
+ resource_formats = vl_video_buffer_formats(ctx->pipe, format);
+ if (!resource_formats)
+ return false;
+
+ for(i = 0; i < VL_MAX_PLANES; ++i) {
+ if (!resource_formats[i])
+ continue;
+
+ if (!ctx->pipe->screen->is_format_supported(ctx->pipe->screen, resource_formats[i],
+ PIPE_TEXTURE_2D, 0, PIPE_USAGE_STATIC))
+ return false;
+ }
+
+ return true;
}
static struct pipe_surface *
@@ -215,27 +216,16 @@ vl_context_create_buffer(struct pipe_video_context *context,
unsigned width, unsigned height)
{
struct vl_context *ctx = (struct vl_context*)context;
+ const enum pipe_format *resource_formats;
struct pipe_video_buffer *result;
unsigned buffer_width, buffer_height;
- const enum pipe_format *resource_formats;
-
assert(context);
assert(width > 0 && height > 0);
- switch(buffer_format) {
- case PIPE_FORMAT_YV12:
- resource_formats = const_resource_formats_YV12;
- break;
-
- case PIPE_FORMAT_NV12:
- resource_formats = const_resource_formats_NV12;
- break;
-
- default:
- assert(0);
+ resource_formats = vl_video_buffer_formats(ctx->pipe, buffer_format);
+ if (!resource_formats)
return NULL;
- }
buffer_width = ctx->pot_buffers ? util_next_power_of_two(width) : align(width, MACROBLOCK_WIDTH);
buffer_height = ctx->pot_buffers ? util_next_power_of_two(height) : align(height, MACROBLOCK_HEIGHT);
diff --git a/src/gallium/auxiliary/vl/vl_video_buffer.c b/src/gallium/auxiliary/vl/vl_video_buffer.c
index 976d22830de..93bc096b733 100644
--- a/src/gallium/auxiliary/vl/vl_video_buffer.c
+++ b/src/gallium/auxiliary/vl/vl_video_buffer.c
@@ -38,6 +38,33 @@
#include "vl_video_buffer.h"
+const enum pipe_format const_resource_formats_YV12[3] = {
+ PIPE_FORMAT_R8_UNORM,
+ PIPE_FORMAT_R8_UNORM,
+ PIPE_FORMAT_R8_UNORM
+};
+
+const enum pipe_format const_resource_formats_NV12[3] = {
+ PIPE_FORMAT_R8_UNORM,
+ PIPE_FORMAT_R8G8_UNORM,
+ PIPE_FORMAT_NONE
+};
+
+const enum pipe_format *
+vl_video_buffer_formats(struct pipe_context *pipe, enum pipe_format format)
+{
+ switch(format) {
+ case PIPE_FORMAT_YV12:
+ return const_resource_formats_YV12;
+
+ case PIPE_FORMAT_NV12:
+ return const_resource_formats_NV12;
+
+ default:
+ return NULL;
+ }
+}
+
static void
vl_video_buffer_destroy(struct pipe_video_buffer *buffer)
{
diff --git a/src/gallium/auxiliary/vl/vl_video_buffer.h b/src/gallium/auxiliary/vl/vl_video_buffer.h
index 2dca74f641e..728c6f5f091 100644
--- a/src/gallium/auxiliary/vl/vl_video_buffer.h
+++ b/src/gallium/auxiliary/vl/vl_video_buffer.h
@@ -50,6 +50,12 @@ struct vl_video_buffer
};
/**
+ * get subformats for each plane
+ */
+const enum pipe_format *
+vl_video_buffer_formats(struct pipe_context *pipe, enum pipe_format format);
+
+/**
* initialize a buffer, creating its resources
*/
struct pipe_video_buffer *
diff --git a/src/gallium/include/pipe/p_video_context.h b/src/gallium/include/pipe/p_video_context.h
index 2a30099c5b0..c9e618b6080 100644
--- a/src/gallium/include/pipe/p_video_context.h
+++ b/src/gallium/include/pipe/p_video_context.h
@@ -62,12 +62,11 @@ struct pipe_video_context
int (*get_param)(struct pipe_video_context *context, int param);
/**
- * Check if the given pipe_format is supported as a texture or
- * drawing surface.
+ * Check if the given pipe_format is supported as a video buffer
*/
boolean (*is_format_supported)(struct pipe_video_context *context,
enum pipe_format format,
- unsigned usage);
+ enum pipe_video_profile profile);
/**
* create a surface of a texture