From: Christian König Date: Thu, 2 May 2013 14:02:05 +0000 (+0200) Subject: vl/idct: fix for commit 7d2f2a0c890b1993532a45c8c392c28950ddc06e X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=85b0880a17a2cffb4b1116267656b33e79e1518f;p=mesa.git vl/idct: fix for commit 7d2f2a0c890b1993532a45c8c392c28950ddc06e 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 --- diff --git a/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c b/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c index eb82b95bb4c..1eb970888b6 100644 --- a/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c +++ b/src/gallium/auxiliary/vl/vl_mpeg12_decoder.c @@ -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; diff --git a/src/gallium/auxiliary/vl/vl_video_buffer.c b/src/gallium/auxiliary/vl/vl_video_buffer.c index fe33325c0b4..6ef95e44be7 100644 --- a/src/gallium/auxiliary/vl/vl_video_buffer.c +++ b/src/gallium/auxiliary/vl/vl_video_buffer.c @@ -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; diff --git a/src/gallium/auxiliary/vl/vl_video_buffer.h b/src/gallium/auxiliary/vl/vl_video_buffer.h index 1285f526edf..178f429830e 100644 --- a/src/gallium/auxiliary/vl/vl_video_buffer.h +++ b/src/gallium/auxiliary/vl/vl_video_buffer.h @@ -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 diff --git a/src/gallium/drivers/r600/r600_uvd.c b/src/gallium/drivers/r600/r600_uvd.c index a1724671477..9d8ae9427ab 100644 --- a/src/gallium/drivers/r600/r600_uvd.c +++ b/src/gallium/drivers/r600/r600_uvd.c @@ -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 *) diff --git a/src/gallium/drivers/radeonsi/radeonsi_uvd.c b/src/gallium/drivers/radeonsi/radeonsi_uvd.c index a618a2bc1f7..f6ab10d29c4 100644 --- a/src/gallium/drivers/radeonsi/radeonsi_uvd.c +++ b/src/gallium/drivers/radeonsi/radeonsi_uvd.c @@ -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);