vl/idct: fix for commit 7d2f2a0c890b1993532a45c8c392c28950ddc06e
authorChristian König <christian.koenig@amd.com>
Thu, 2 May 2013 14:02:05 +0000 (16:02 +0200)
committerChristian König <christian.koenig@amd.com>
Fri, 3 May 2013 09:00:21 +0000 (11:00 +0200)
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>
src/gallium/auxiliary/vl/vl_mpeg12_decoder.c
src/gallium/auxiliary/vl/vl_video_buffer.c
src/gallium/auxiliary/vl/vl_video_buffer.h
src/gallium/drivers/r600/r600_uvd.c
src/gallium/drivers/radeonsi/radeonsi_uvd.c

index eb82b95bb4c43e460fe2d0d875745ff6094bb789..1eb970888b61dd0cabf7ce1b0677a8b17e8d9331 100644 (file)
@@ -902,7 +902,7 @@ init_idct(struct vl_mpeg12_decoder *dec, const struct format_config* format_conf
    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)
@@ -916,7 +916,7 @@ init_idct(struct vl_mpeg12_decoder *dec, const struct format_config* format_conf
    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)
@@ -967,7 +967,7 @@ init_mc_source_widthout_idct(struct vl_mpeg12_decoder *dec, const struct format_
    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;
index fe33325c0b47ddfe4533f8de8a1b76920b2746f5..6ef95e44be7eb845feeaeba1cdc22b03e0e97c01 100644 (file)
@@ -216,15 +216,20 @@ void
 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;
@@ -420,7 +425,7 @@ vl_video_buffer_create(struct pipe_context *pipe,
    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
    );
 
 
@@ -434,7 +439,7 @@ struct pipe_video_buffer *
 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];
@@ -444,7 +449,7 @@ vl_video_buffer_create_ex(struct pipe_context *pipe,
 
    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;
@@ -454,7 +459,7 @@ vl_video_buffer_create_ex(struct pipe_context *pipe,
       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;
@@ -462,7 +467,7 @@ vl_video_buffer_create_ex(struct pipe_context *pipe,
    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;
index 1285f526edf5a1336163aee6fa3344b5c2cc6396..178f429830ea0973fa7e53679f2652c8a8622b30 100644 (file)
@@ -98,8 +98,8 @@ void
 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
@@ -109,13 +109,13 @@ vl_video_buffer_create(struct pipe_context *pipe,
                        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
index a1724671477accfab784b7482c4e410d0908ba3a..9d8ae9427ab46a3af2ab678563a3434195cb3cda 100644 (file)
@@ -75,7 +75,7 @@ struct pipe_video_buffer *r600_video_buffer_create(struct pipe_context *pipe,
        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 *)
@@ -84,7 +84,7 @@ struct pipe_video_buffer *r600_video_buffer_create(struct pipe_context *pipe,
                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 *)
@@ -94,7 +94,7 @@ struct pipe_video_buffer *r600_video_buffer_create(struct pipe_context *pipe,
        }
 
        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 *)
index a618a2bc1f7c468844c8ce006914d7b1864be2d2..f6ab10d29c43d7586e36bd6ad6eb9b85fc47963a 100644 (file)
@@ -75,7 +75,7 @@ struct pipe_video_buffer *radeonsi_video_buffer_create(struct pipe_context *pipe
        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 *)
@@ -84,7 +84,7 @@ struct pipe_video_buffer *radeonsi_video_buffer_create(struct pipe_context *pipe
                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);
@@ -93,7 +93,7 @@ struct pipe_video_buffer *radeonsi_video_buffer_create(struct pipe_context *pipe
        }
 
        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);