On Sun, 1 May 2022 at 20:39, Stefan Dösinger stefan@codeweavers.com wrote:
+void wined3d_resource_memory_colour_fill(struct wined3d_resource *resource,
unsigned int level, 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;
- struct wined3d_box level_box;
- uint8_t *dst, *dst2;
- DWORD c;
- if (resource->type == WINED3D_RTYPE_BUFFER)
- {
level_box.left = 0; level_box.top = 0; level_box.front = 0;
level_box.right = resource->width; level_box.bottom = 1; level_box.back = 1;
- }
- else
- {
wined3d_texture_get_level_box(texture_from_resource(resource), level, &level_box);
- }
- w = min(box->right, level_box.right) - min(box->left, level_box.right);
- h = min(box->bottom, level_box.bottom) - min(box->top, level_box.bottom);
- if (resource->type != WINED3D_RTYPE_TEXTURE_3D)
d = 1;
- else
d = min(box->back, level_box.back) - min(box->front, level_box.back);
This (i.e., clipping the supplied box against the resource dimensions) doesn't belong here; the caller should simply supply the correct box. Arguably it doesn't belong in surface_cpu_blt_colour_fill() either; the most appropriate place would be cpu_blitter_clear().
- dst = (BYTE *)map->data
+ (box->front * map->slice_pitch)
+ ((box->top / format->block_height) * map->row_pitch)
+ ((box->left / format->block_width) * format->block_byte_count);
We might as well cast to "uint8_t *". (And use uint16_t and uint32_t further below.)
- 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)
{
((WORD *)dst)[x] = c;
}
break;
case 3:
{
dst2 = dst;
for (x = 0; x < w; ++x, dst += 3)
{
dst2[0] = (c ) & 0xff;
dst2[1] = (c >> 8) & 0xff;
dst2[2] = (c >> 16) & 0xff;
}
break;
}
Does that do the right thing? We update "dst", but not "dst2".