Stefan Dösinger : wined3d: Separate mapping from data writing in surface_cpu_blt_colour_fill.
Alexandre Julliard
julliard at winehq.org
Fri May 13 15:45:13 CDT 2022
Module: wine
Branch: master
Commit: 7bf8b53d57d14909a1a71b977de54e277e8abe01
URL: https://source.winehq.org/git/wine.git/?a=commit;h=7bf8b53d57d14909a1a71b977de54e277e8abe01
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Fri May 13 15:54:35 2022 +0300
wined3d: Separate mapping from data writing in surface_cpu_blt_colour_fill.
Signed-off-by: Stefan Dösinger <stefan at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/wined3d/resource.c | 76 ++++++++++++++++++++++++++++++++++++++++++
dlls/wined3d/surface.c | 68 ++-----------------------------------
dlls/wined3d/wined3d_private.h | 3 ++
3 files changed, 81 insertions(+), 66 deletions(-)
diff --git a/dlls/wined3d/resource.c b/dlls/wined3d/resource.c
index 437f9c9da69..7587a6455a4 100644
--- a/dlls/wined3d/resource.c
+++ b/dlls/wined3d/resource.c
@@ -613,3 +613,79 @@ void *resource_offset_map_pointer(struct wined3d_resource *resource, unsigned in
+ (box->left * format->byte_count);
}
}
+
+void wined3d_resource_memory_colour_fill(struct wined3d_resource *resource,
+ const struct wined3d_map_desc *map, const struct wined3d_color *colour,
+ const struct wined3d_box *box)
+{
+ const struct wined3d_format *format = resource->format;
+ unsigned int w, h, d, x, y, z, bpp;
+ uint8_t *dst, *dst2;
+ uint32_t c;
+
+ w = box->right - box->left;
+ h = box->bottom - box->top;
+ d = box->back - box->front;
+
+ dst = (uint8_t *)map->data
+ + (box->front * map->slice_pitch)
+ + ((box->top / format->block_height) * map->row_pitch)
+ + ((box->left / format->block_width) * format->block_byte_count);
+
+ c = wined3d_format_convert_from_float(format, colour);
+ bpp = format->byte_count;
+
+ switch (bpp)
+ {
+ case 1:
+ for (x = 0; x < w; ++x)
+ {
+ dst[x] = c;
+ }
+ break;
+
+ case 2:
+ for (x = 0; x < w; ++x)
+ {
+ ((uint16_t *)dst)[x] = c;
+ }
+ break;
+
+ case 3:
+ {
+ dst2 = dst;
+ for (x = 0; x < w; ++x, dst2 += 3)
+ {
+ dst2[0] = (c ) & 0xff;
+ dst2[1] = (c >> 8) & 0xff;
+ dst2[2] = (c >> 16) & 0xff;
+ }
+ break;
+ }
+ case 4:
+ for (x = 0; x < w; ++x)
+ {
+ ((uint32_t *)dst)[x] = c;
+ }
+ break;
+
+ default:
+ FIXME("Not implemented for bpp %u.\n", bpp);
+ return;
+ }
+
+ dst2 = dst;
+ for (y = 1; y < h; ++y)
+ {
+ dst2 += map->row_pitch;
+ memcpy(dst2, dst, w * bpp);
+ }
+
+ dst2 = dst;
+ for (z = 1; z < d; ++z)
+ {
+ dst2 += map->slice_pitch;
+ memcpy(dst2, dst, w * h * bpp);
+ }
+
+}
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index 448c8689342..0d4809ea55b 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -1241,15 +1241,13 @@ static void surface_cpu_blt_colour_fill(struct wined3d_rendertarget_view *view,
const struct wined3d_box *box, const struct wined3d_color *colour)
{
struct wined3d_device *device = view->resource->device;
- unsigned int x, y, z, w, h, d, bpp, level;
struct wined3d_context *context;
struct wined3d_texture *texture;
struct wined3d_bo_address data;
struct wined3d_map_desc map;
struct wined3d_range range;
+ unsigned int level;
DWORD map_binding;
- uint8_t *dst;
- DWORD c;
TRACE("view %p, box %s, colour %s.\n", view, debug_box(box), debug_color(colour));
@@ -1274,12 +1272,6 @@ static void surface_cpu_blt_colour_fill(struct wined3d_rendertarget_view *view,
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 = box->right - box->left;
- h = box->bottom - box->top;
- d = box->back - box->front;
-
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));
@@ -1288,66 +1280,10 @@ static void surface_cpu_blt_colour_fill(struct wined3d_rendertarget_view *view,
wined3d_texture_get_bo_address(texture, view->sub_resource_idx, &data, map_binding);
map.data = wined3d_context_map_bo_address(context, &data,
texture->sub_resources[view->sub_resource_idx].size, WINED3D_MAP_WRITE);
- map.data = (BYTE *)map.data
- + (box->front * map.slice_pitch)
- + ((box->top / view->format->block_height) * map.row_pitch)
- + ((box->left / view->format->block_width) * view->format->block_byte_count);
range.offset = 0;
range.size = texture->sub_resources[view->sub_resource_idx].size;
- switch (bpp)
- {
- case 1:
- for (x = 0; x < w; ++x)
- {
- ((BYTE *)map.data)[x] = c;
- }
- break;
-
- case 2:
- for (x = 0; x < w; ++x)
- {
- ((WORD *)map.data)[x] = c;
- }
- break;
-
- case 3:
- {
- dst = map.data;
- for (x = 0; x < w; ++x, dst += 3)
- {
- dst[0] = (c ) & 0xff;
- dst[1] = (c >> 8) & 0xff;
- dst[2] = (c >> 16) & 0xff;
- }
- break;
- }
- case 4:
- for (x = 0; x < w; ++x)
- {
- ((DWORD *)map.data)[x] = c;
- }
- break;
-
- default:
- FIXME("Not implemented for bpp %u.\n", bpp);
- wined3d_resource_unmap(view->resource, view->sub_resource_idx);
- return;
- }
-
- dst = map.data;
- for (y = 1; y < h; ++y)
- {
- 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_resource_memory_colour_fill(view->resource, &map, colour, box);
wined3d_context_unmap_bo_address(context, &data, 1, &range);
context_release(context);
diff --git a/dlls/wined3d/wined3d_private.h b/dlls/wined3d/wined3d_private.h
index cad697e9d23..ba1dc2169b0 100644
--- a/dlls/wined3d/wined3d_private.h
+++ b/dlls/wined3d/wined3d_private.h
@@ -4365,6 +4365,9 @@ GLbitfield wined3d_resource_gl_storage_flags(const struct wined3d_resource *reso
BOOL wined3d_resource_is_offscreen(struct wined3d_resource *resource) DECLSPEC_HIDDEN;
BOOL wined3d_resource_prepare_sysmem(struct wined3d_resource *resource) DECLSPEC_HIDDEN;
void wined3d_resource_update_draw_binding(struct wined3d_resource *resource) DECLSPEC_HIDDEN;
+void wined3d_resource_memory_colour_fill(struct wined3d_resource *resource,
+ const struct wined3d_map_desc *map, const struct wined3d_color *colour,
+ const struct wined3d_box *box) DECLSPEC_HIDDEN;
/* Tests show that the start address of resources is 32 byte aligned */
#define RESOURCE_ALIGNMENT 16
More information about the wine-cvs
mailing list