From: Zebediah Figura zfigura@codeweavers.com
--- dlls/wined3d/device.c | 12 ++----- dlls/wined3d/texture.c | 61 +++++++++++----------------------- dlls/wined3d/wined3d_private.h | 2 ++ 3 files changed, 24 insertions(+), 51 deletions(-)
diff --git a/dlls/wined3d/device.c b/dlls/wined3d/device.c index f215da6d310..2cd558051d1 100644 --- a/dlls/wined3d/device.c +++ b/dlls/wined3d/device.c @@ -4905,17 +4905,11 @@ HRESULT CDECL wined3d_device_context_copy_sub_resource_region(struct wined3d_dev unsigned int src_level = src_sub_resource_idx % src_texture->level_count; unsigned int src_row_block_count, src_row_count;
- if (dst_sub_resource_idx >= dst_texture->level_count * dst_texture->layer_count) - { - WARN("Invalid destination sub-resource %u.\n", dst_sub_resource_idx); + if (!wined3d_texture_validate_sub_resource_idx(dst_texture, dst_sub_resource_idx)) return WINED3DERR_INVALIDCALL; - }
- if (src_sub_resource_idx >= src_texture->level_count * src_texture->layer_count) - { - WARN("Invalid source sub-resource %u.\n", src_sub_resource_idx); + if (!wined3d_texture_validate_sub_resource_idx(src_texture, src_sub_resource_idx)) return WINED3DERR_INVALIDCALL; - }
if (dst_texture->sub_resources[dst_sub_resource_idx].map_count) { @@ -5369,7 +5363,7 @@ HRESULT CDECL wined3d_device_set_cursor_properties(struct wined3d_device *device TRACE("device %p, x_hotspot %u, y_hotspot %u, texture %p, sub_resource_idx %u.\n", device, x_hotspot, y_hotspot, texture, sub_resource_idx);
- if (sub_resource_idx >= texture->level_count * texture->layer_count + if (!wined3d_texture_validate_sub_resource_idx(texture, sub_resource_idx) || texture->resource.type != WINED3D_RTYPE_TEXTURE_2D) return WINED3DERR_INVALIDCALL;
diff --git a/dlls/wined3d/texture.c b/dlls/wined3d/texture.c index 10a8dcb06f4..09b26933353 100644 --- a/dlls/wined3d/texture.c +++ b/dlls/wined3d/texture.c @@ -45,6 +45,15 @@ struct wined3d_rect_f float b; };
+bool wined3d_texture_validate_sub_resource_idx(const struct wined3d_texture *texture, unsigned int sub_resource_idx) +{ + if (sub_resource_idx < texture->level_count * texture->layer_count) + return true; + + WARN("Invalid sub-resource index %u.\n", sub_resource_idx); + return false; +} + BOOL wined3d_texture_can_use_pbo(const struct wined3d_texture *texture, const struct wined3d_d3d_info *d3d_info) { if (!d3d_info->pbo || texture->resource.format->conv_byte_count || texture->resource.pin_sysmem @@ -2212,16 +2221,10 @@ BOOL wined3d_texture_prepare_location(struct wined3d_texture *texture, static struct wined3d_texture_sub_resource *wined3d_texture_get_sub_resource(struct wined3d_texture *texture, unsigned int sub_resource_idx) { - UINT sub_count = texture->level_count * texture->layer_count; - TRACE("texture %p, sub_resource_idx %u.\n", texture, sub_resource_idx);
- if (sub_resource_idx >= sub_count) - { - WARN("sub_resource_idx %u >= sub_count %u.\n", sub_resource_idx, sub_count); + if (!wined3d_texture_validate_sub_resource_idx(texture, sub_resource_idx)) return NULL; - } - return &texture->sub_resources[sub_resource_idx]; }
@@ -4127,11 +4130,11 @@ HRESULT CDECL wined3d_device_context_blt(struct wined3d_device_context *context, context, dst_texture, dst_sub_resource_idx, wine_dbgstr_rect(dst_rect), src_texture, src_sub_resource_idx, wine_dbgstr_rect(src_rect), flags, fx, debug_d3dtexturefiltertype(filter));
- if (dst_sub_resource_idx >= dst_texture->level_count * dst_texture->layer_count + if (!wined3d_texture_validate_sub_resource_idx(dst_texture, dst_sub_resource_idx) || dst_texture->resource.type != WINED3D_RTYPE_TEXTURE_2D) return WINED3DERR_INVALIDCALL;
- if (src_sub_resource_idx >= src_texture->level_count * src_texture->layer_count + if (!wined3d_texture_validate_sub_resource_idx(src_texture, src_sub_resource_idx) || src_texture->resource.type != WINED3D_RTYPE_TEXTURE_2D) return WINED3DERR_INVALIDCALL;
@@ -4179,11 +4182,8 @@ HRESULT CDECL wined3d_texture_get_overlay_position(const struct wined3d_texture TRACE("texture %p, sub_resource_idx %u, x %p, y %p.\n", texture, sub_resource_idx, x, y);
if (!(texture->resource.usage & WINED3DUSAGE_OVERLAY) - || sub_resource_idx >= texture->level_count * texture->layer_count) - { - WARN("Invalid sub-resource specified.\n"); + || !wined3d_texture_validate_sub_resource_idx(texture, sub_resource_idx)) return WINEDDERR_NOTAOVERLAYSURFACE; - }
overlay = &texture->overlay_info[sub_resource_idx]; if (!overlay->dst_texture) @@ -4211,11 +4211,8 @@ HRESULT CDECL wined3d_texture_set_overlay_position(struct wined3d_texture *textu TRACE("texture %p, sub_resource_idx %u, x %d, y %d.\n", texture, sub_resource_idx, x, y);
if (!(texture->resource.usage & WINED3DUSAGE_OVERLAY) - || sub_resource_idx >= texture->level_count * texture->layer_count) - { - WARN("Invalid sub-resource specified.\n"); + || !wined3d_texture_validate_sub_resource_idx(texture, sub_resource_idx)) return WINEDDERR_NOTAOVERLAYSURFACE; - }
overlay = &texture->overlay_info[sub_resource_idx]; w = overlay->dst_rect.right - overlay->dst_rect.left; @@ -4238,18 +4235,12 @@ HRESULT CDECL wined3d_texture_update_overlay(struct wined3d_texture *texture, un dst_sub_resource_idx, wine_dbgstr_rect(dst_rect), flags);
if (!(texture->resource.usage & WINED3DUSAGE_OVERLAY) || texture->resource.type != WINED3D_RTYPE_TEXTURE_2D - || sub_resource_idx >= texture->level_count * texture->layer_count) - { - WARN("Invalid sub-resource specified.\n"); + || !wined3d_texture_validate_sub_resource_idx(texture, sub_resource_idx)) return WINEDDERR_NOTAOVERLAYSURFACE; - }
if (!dst_texture || dst_texture->resource.type != WINED3D_RTYPE_TEXTURE_2D - || dst_sub_resource_idx >= dst_texture->level_count * dst_texture->layer_count) - { - WARN("Invalid destination sub-resource specified.\n"); + || wined3d_texture_validate_sub_resource_idx(dst_texture, dst_sub_resource_idx)) return WINED3DERR_INVALIDCALL; - }
overlay = &texture->overlay_info[sub_resource_idx];
@@ -4298,15 +4289,10 @@ HRESULT CDECL wined3d_texture_update_overlay(struct wined3d_texture *texture, un
void * CDECL wined3d_texture_get_sub_resource_parent(struct wined3d_texture *texture, unsigned int sub_resource_idx) { - unsigned int sub_count = texture->level_count * texture->layer_count; - TRACE("texture %p, sub_resource_idx %u.\n", texture, sub_resource_idx);
- if (sub_resource_idx >= sub_count) - { - WARN("sub_resource_idx %u >= sub_count %u.\n", sub_resource_idx, sub_count); + if (!wined3d_texture_validate_sub_resource_idx(texture, sub_resource_idx)) return NULL; - }
return texture->sub_resources[sub_resource_idx].parent; } @@ -4314,15 +4300,10 @@ void * CDECL wined3d_texture_get_sub_resource_parent(struct wined3d_texture *tex void CDECL wined3d_texture_set_sub_resource_parent(struct wined3d_texture *texture, unsigned int sub_resource_idx, void *parent) { - unsigned int sub_count = texture->level_count * texture->layer_count; - TRACE("texture %p, sub_resource_idx %u, parent %p.\n", texture, sub_resource_idx, parent);
- if (sub_resource_idx >= sub_count) - { - WARN("sub_resource_idx %u >= sub_count %u.\n", sub_resource_idx, sub_count); + if (!wined3d_texture_validate_sub_resource_idx(texture, sub_resource_idx)) return; - }
texture->sub_resources[sub_resource_idx].parent = parent; } @@ -4330,17 +4311,13 @@ void CDECL wined3d_texture_set_sub_resource_parent(struct wined3d_texture *textu HRESULT CDECL wined3d_texture_get_sub_resource_desc(const struct wined3d_texture *texture, unsigned int sub_resource_idx, struct wined3d_sub_resource_desc *desc) { - unsigned int sub_count = texture->level_count * texture->layer_count; const struct wined3d_resource *resource; unsigned int level_idx;
TRACE("texture %p, sub_resource_idx %u, desc %p.\n", texture, sub_resource_idx, desc);
- if (sub_resource_idx >= sub_count) - { - WARN("sub_resource_idx %u >= sub_count %u.\n", sub_resource_idx, sub_count); + if (!wined3d_texture_validate_sub_resource_idx(texture, sub_resource_idx)) return WINED3DERR_INVALIDCALL; - }
resource = &texture->resource; desc->format = resource->format->id; diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h index 1dbd90067f5..a87471fd5d1 100644 --- a/dlls/wined3d/wined3d_private.h +++ b/dlls/wined3d/wined3d_private.h @@ -4690,6 +4690,8 @@ void wined3d_texture_upload_from_texture(struct wined3d_texture *dst_texture, un unsigned int src_sub_resource_idx, const struct wined3d_box *src_box) DECLSPEC_HIDDEN; void wined3d_texture_validate_location(struct wined3d_texture *texture, unsigned int sub_resource_idx, DWORD location) DECLSPEC_HIDDEN; +bool wined3d_texture_validate_sub_resource_idx(const struct wined3d_texture *texture, + unsigned int sub_resource_idx) DECLSPEC_HIDDEN; void wined3d_texture_clear_dirty_regions(struct wined3d_texture *texture) DECLSPEC_HIDDEN;
HRESULT wined3d_texture_no3d_init(struct wined3d_texture *texture_no3d, struct wined3d_device *device,