FREE(ctx);
}
+static int
+sp_mpeg12_get_param(struct pipe_video_context *vpipe, int param)
+{
+ struct sp_mpeg12_context *ctx = (struct sp_mpeg12_context*)vpipe;
+
+ assert(vpipe);
+
+ switch (param) {
+ case PIPE_CAP_NPOT_TEXTURES:
+ /* XXX: Temporary; not all paths are NPOT-tested */
+#if 0
+ return ctx->pipe->screen->get_param(ctx->pipe->screen, param);
+#endif
+ return FALSE;
+ case PIPE_CAP_DECODE_TARGET_PREFERRED_FORMAT:
+ return PIPE_FORMAT_AYUV;
+ default:
+ {
+ debug_printf("Softpipe: Unknown PIPE_CAP %d\n", param);
+ return 0;
+ }
+ }
+}
+
+static boolean
+sp_mpeg12_is_format_supported(struct pipe_video_context *vpipe,
+ enum pipe_format format,
+ unsigned usage,
+ unsigned geom)
+{
+ struct sp_mpeg12_context *ctx = (struct sp_mpeg12_context*)vpipe;
+
+ assert(vpipe);
+
+ /* XXX: Temporary; not all paths are NPOT-tested */
+ if (geom & PIPE_TEXTURE_GEOM_NON_POWER_OF_TWO)
+ return FALSE;
+
+ return ctx->pipe->screen->is_format_supported(ctx->pipe->screen, PIPE_TEXTURE_2D,
+ format, usage, geom);
+}
+
static void
sp_mpeg12_decode_macroblocks(struct pipe_video_context *vpipe,
struct pipe_surface *past,
ctx->base.screen = pipe->screen;
ctx->base.destroy = sp_mpeg12_destroy;
+ ctx->base.get_param = sp_mpeg12_get_param;
+ ctx->base.is_format_supported = sp_mpeg12_is_format_supported;
ctx->base.decode_macroblocks = sp_mpeg12_decode_macroblocks;
ctx->base.render_picture = sp_mpeg12_render_picture;
ctx->base.surface_fill = sp_mpeg12_surface_fill;
#include <pipe/p_video_state.h>
+/* XXX: Move to an appropriate place */
+#define PIPE_CAP_DECODE_TARGET_PREFERRED_FORMAT 256
+
struct pipe_screen;
struct pipe_buffer;
struct pipe_surface;
void *priv; /**< context private data (for DRI for example) */
+ /**
+ * Query an integer-valued capability/parameter/limit
+ * \param param one of PIPE_CAP_x
+ */
+ int (*get_param)(struct pipe_video_context *vpipe, int param);
+
+ /**
+ * Check if the given pipe_format is supported as a texture or
+ * drawing surface.
+ */
+ boolean (*is_format_supported)(struct pipe_video_context *vpipe,
+ enum pipe_format format,
+ unsigned usage,
+ unsigned geom);
+
void (*destroy)(struct pipe_video_context *vpipe);
/**
memset(&template, 0, sizeof(struct pipe_texture));
template.target = PIPE_TEXTURE_2D;
- /* XXX: Let the pipe_video_context choose whatever format it likes to render to */
- template.format = PIPE_FORMAT_AYUV;
+ template.format = (enum pipe_format)vpipe->get_param(vpipe, PIPE_CAP_DECODE_TARGET_PREFERRED_FORMAT);
template.last_level = 0;
- /* XXX: vl_mpeg12_mc_renderer expects this when it's initialized with pot_buffers=true, clean this up */
- template.width0 = util_next_power_of_two(context->width);
- template.height0 = util_next_power_of_two(context->height);
+ if (vpipe->is_format_supported(vpipe, template.format,
+ PIPE_TEXTURE_USAGE_SAMPLER |
+ PIPE_TEXTURE_USAGE_RENDER_TARGET,
+ PIPE_TEXTURE_GEOM_NON_POWER_OF_TWO)) {
+ template.width0 = context->width;
+ template.height0 = context->height;
+ }
+ else {
+ assert(vpipe->is_format_supported(vpipe, template.format,
+ PIPE_TEXTURE_USAGE_SAMPLER |
+ PIPE_TEXTURE_USAGE_RENDER_TARGET,
+ PIPE_TEXTURE_GEOM_NON_SQUARE));
+ template.width0 = util_next_power_of_two(context->width);
+ template.height0 = util_next_power_of_two(context->height);
+ }
template.depth0 = 1;
template.tex_usage = PIPE_TEXTURE_USAGE_SAMPLER | PIPE_TEXTURE_USAGE_RENDER_TARGET;
vsfc_tex = vpipe->screen->texture_create(vpipe->screen, &template);