[PATCH 3/7] wined3d: Implement wined3d_update_sub_resource() for 3D textures.
Józef Kucia
joseph.kucia at gmail.com
Mon Nov 14 10:31:18 CST 2016
From: Józef Kucia <jkucia at codeweavers.com>
Fixes a regression introduced by commit
e58689a3981fae5b312b12e9f6801adf289d04c0.
Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
---
dlls/wined3d/device.c | 12 +++++++-----
dlls/wined3d/texture.c | 33 ++++++++++++++++++++++++---------
2 files changed, 31 insertions(+), 14 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c
index 6e10dce..90ac18a 100644
--- a/dlls/wined3d/device.c
+++ b/dlls/wined3d/device.c
@@ -4063,8 +4063,8 @@ void CDECL wined3d_device_update_sub_resource(struct wined3d_device *device, str
unsigned int sub_resource_idx, const struct wined3d_box *box, const void *data, unsigned int row_pitch,
unsigned int depth_pitch)
{
+ unsigned int width, height, depth, level;
struct wined3d_const_bo_address addr;
- unsigned int width, height, level;
struct wined3d_context *context;
struct wined3d_texture *texture;
@@ -4088,7 +4088,7 @@ void CDECL wined3d_device_update_sub_resource(struct wined3d_device *device, str
return;
}
- if (resource->type != WINED3D_RTYPE_TEXTURE_2D)
+ if (resource->type != WINED3D_RTYPE_TEXTURE_2D && resource->type != WINED3D_RTYPE_TEXTURE_3D)
{
FIXME("Not implemented for %s resources.\n", debug_d3dresourcetype(resource->type));
return;
@@ -4104,10 +4104,11 @@ void CDECL wined3d_device_update_sub_resource(struct wined3d_device *device, str
level = sub_resource_idx % texture->level_count;
width = wined3d_texture_get_level_width(texture, level);
height = wined3d_texture_get_level_height(texture, level);
+ depth = wined3d_texture_get_level_depth(texture, level);
if (box && (box->left >= box->right || box->right > width
|| box->top >= box->bottom || box->bottom > height
- || box->front >= box->back))
+ || box->front >= box->back || box->back > depth))
{
WARN("Invalid box %s specified.\n", debug_box(box));
return;
@@ -4118,8 +4119,9 @@ void CDECL wined3d_device_update_sub_resource(struct wined3d_device *device, str
context = context_acquire(resource->device, NULL);
- /* Only load the surface for partial updates. */
- if (!box || (!box->left && !box->top && box->right == width && box->bottom == height))
+ /* Only load the sub-resource for partial updates. */
+ if (!box || (!box->left && !box->top && !box->front
+ && box->right == width && box->bottom == height && box->back == depth))
wined3d_texture_prepare_texture(texture, context, FALSE);
else
wined3d_texture_load_location(texture, sub_resource_idx, context, WINED3D_LOCATION_TEXTURE_RGB);
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c
index 59468f5..4a572ab 100644
--- a/dlls/wined3d/texture.c
+++ b/dlls/wined3d/texture.c
@@ -2112,6 +2112,7 @@ static void texture3d_upload_data(struct wined3d_texture *texture, unsigned int
const struct wined3d_format *format = texture->resource.format;
unsigned int level = sub_resource_idx % texture->level_count;
const struct wined3d_gl_info *gl_info = context->gl_info;
+ unsigned int x, y, z, update_w, update_h, update_d;
unsigned int dst_row_pitch, dst_slice_pitch;
unsigned int width, height, depth;
const void *mem = data->addr;
@@ -2121,13 +2122,27 @@ static void texture3d_upload_data(struct wined3d_texture *texture, unsigned int
texture, sub_resource_idx, context, debug_box(box),
data->buffer_object, data->addr, row_pitch, slice_pitch);
- if (box)
- FIXME("Partial upload not supported yet.\n");
-
width = wined3d_texture_get_level_width(texture, level);
height = wined3d_texture_get_level_height(texture, level);
depth = wined3d_texture_get_level_depth(texture, level);
+ if (!box)
+ {
+ x = y = z = 0;
+ update_w = width;
+ update_h = height;
+ update_d = depth;
+ }
+ else
+ {
+ x = box->left;
+ y = box->top;
+ z = box->front;
+ update_w = box->right - box->left;
+ update_h = box->bottom - box->top;
+ update_d = box->back - box->front;
+ }
+
if (format->convert)
{
if (data->buffer_object)
@@ -2135,12 +2150,12 @@ static void texture3d_upload_data(struct wined3d_texture *texture, unsigned int
if (texture->resource.format_flags & WINED3DFMT_FLAG_BLOCKS)
ERR("Converting a block-based format.\n");
- dst_row_pitch = width * format->conv_byte_count;
- dst_slice_pitch = dst_row_pitch * height;
+ dst_row_pitch = update_w * format->conv_byte_count;
+ dst_slice_pitch = dst_row_pitch * update_h;
- converted_mem = wined3d_calloc(depth, dst_slice_pitch);
+ converted_mem = wined3d_calloc(update_d, dst_slice_pitch);
format->convert(data->addr, converted_mem, row_pitch, slice_pitch,
- dst_row_pitch, dst_slice_pitch, width, height, depth);
+ dst_row_pitch, dst_slice_pitch, update_w, update_h, update_d);
mem = converted_mem;
}
else
@@ -2156,8 +2171,8 @@ static void texture3d_upload_data(struct wined3d_texture *texture, unsigned int
checkGLcall("glBindBuffer");
}
- GL_EXTCALL(glTexSubImage3D(GL_TEXTURE_3D, level, 0, 0, 0,
- width, height, depth, format->glFormat, format->glType, mem));
+ GL_EXTCALL(glTexSubImage3D(GL_TEXTURE_3D, level, x, y, z,
+ update_w, update_h, update_d, format->glFormat, format->glType, mem));
checkGLcall("glTexSubImage3D");
if (data->buffer_object)
--
2.10.2
More information about the wine-patches
mailing list