wined3d: Implement wined3d_update_sub_resource() for 3D textures.
Fixes a regression introduced by commit
e58689a398
.
Signed-off-by: Józef Kucia <jkucia@codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
76d101b85c
commit
685246b4a1
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue