Henri Verbeet : wined3d: Implement 3D texture clears in surface_cpu_blt_colour_fill().
Alexandre Julliard
julliard at winehq.org
Thu Aug 15 14:50:47 CDT 2019
Module: wine
Branch: master
Commit: 3de4515c18e08dc3d9ab832fc79e8f9c86cf9b41
URL: https://source.winehq.org/git/wine.git/?a=commit;h=3de4515c18e08dc3d9ab832fc79e8f9c86cf9b41
Author: Henri Verbeet <hverbeet at codeweavers.com>
Date: Thu Aug 15 14:38:03 2019 +0430
wined3d: Implement 3D texture clears in surface_cpu_blt_colour_fill().
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wined3d/surface.c | 45 +++++++++++++++++++++++++++++++--------------
1 file changed, 31 insertions(+), 14 deletions(-)
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 73cf87d..00278d5 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -2119,13 +2119,13 @@ static void surface_cpu_blt_colour_fill(struct wined3d_rendertarget_view *view,
{
struct wined3d_device *device = view->resource->device;
struct wined3d_context_gl *context_gl = NULL;
+ unsigned int x, y, z, w, h, d, bpp, level;
struct wined3d_context *context = NULL;
struct wined3d_texture *texture;
struct wined3d_bo_address data;
- unsigned int x, y, w, h, bpp;
struct wined3d_map_desc map;
DWORD map_binding;
- BYTE *row;
+ uint8_t *dst;
DWORD c;
TRACE("view %p, box %s, colour %s.\n", view, debug_box(box), debug_color(colour));
@@ -2152,18 +2152,28 @@ static void surface_cpu_blt_colour_fill(struct wined3d_rendertarget_view *view,
context_gl = wined3d_context_gl(context);
}
+ texture = texture_from_resource(view->resource);
+ level = view->sub_resource_idx % texture->level_count;
+
c = wined3d_format_convert_from_float(view->format, colour);
bpp = view->format->byte_count;
w = min(box->right, view->width) - min(box->left, view->width);
h = min(box->bottom, view->height) - min(box->top, view->height);
+ if (view->resource->type != WINED3D_RTYPE_TEXTURE_3D)
+ {
+ d = 1;
+ }
+ else
+ {
+ d = wined3d_texture_get_level_depth(texture, level);
+ d = min(box->back, d) - min(box->front, d);
+ }
- texture = texture_from_resource(view->resource);
map_binding = texture->resource.map_binding;
if (!wined3d_texture_load_location(texture, view->sub_resource_idx, context, map_binding))
ERR("Failed to load the sub-resource into %s.\n", wined3d_debug_location(map_binding));
wined3d_texture_invalidate_location(texture, view->sub_resource_idx, ~map_binding);
- wined3d_texture_get_pitch(texture, view->sub_resource_idx % texture->level_count,
- &map.row_pitch, &map.slice_pitch);
+ wined3d_texture_get_pitch(texture, level, &map.row_pitch, &map.slice_pitch);
wined3d_texture_get_memory(texture, view->sub_resource_idx, &data, map_binding);
map.data = wined3d_context_gl_map_bo_address(context_gl, &data,
texture->sub_resources[view->sub_resource_idx].size, GL_PIXEL_UNPACK_BUFFER, WINED3D_MAP_WRITE);
@@ -2190,12 +2200,12 @@ static void surface_cpu_blt_colour_fill(struct wined3d_rendertarget_view *view,
case 3:
{
- row = map.data;
- for (x = 0; x < w; ++x, row += 3)
+ dst = map.data;
+ for (x = 0; x < w; ++x, dst += 3)
{
- row[0] = (c ) & 0xff;
- row[1] = (c >> 8) & 0xff;
- row[2] = (c >> 16) & 0xff;
+ dst[0] = (c ) & 0xff;
+ dst[1] = (c >> 8) & 0xff;
+ dst[2] = (c >> 16) & 0xff;
}
break;
}
@@ -2212,11 +2222,18 @@ static void surface_cpu_blt_colour_fill(struct wined3d_rendertarget_view *view,
return;
}
- row = map.data;
+ dst = map.data;
for (y = 1; y < h; ++y)
{
- row += map.row_pitch;
- memcpy(row, map.data, w * bpp);
+ dst += map.row_pitch;
+ memcpy(dst, map.data, w * bpp);
+ }
+
+ dst = map.data;
+ for (z = 1; z < d; ++z)
+ {
+ dst += map.slice_pitch;
+ memcpy(dst, map.data, w * h * bpp);
}
wined3d_context_gl_unmap_bo_address(context_gl, &data, GL_PIXEL_UNPACK_BUFFER);
@@ -2246,7 +2263,7 @@ static void cpu_blitter_clear(struct wined3d_blitter *blitter, struct wined3d_de
box.right = min(clear_rects[i].right, draw_rect->right);
box.bottom = min(clear_rects[i].bottom, draw_rect->bottom);
box.front = 0;
- box.back = 1;
+ box.back = ~0u;
if (box.left >= box.right || box.top >= box.bottom)
continue;
More information about the wine-cvs
mailing list