diff --git a/hw/xbox/nv2a/pgraph/vk/draw.c b/hw/xbox/nv2a/pgraph/vk/draw.c index 121bea5d74..4cde028b1f 100644 --- a/hw/xbox/nv2a/pgraph/vk/draw.c +++ b/hw/xbox/nv2a/pgraph/vk/draw.c @@ -1698,10 +1698,10 @@ void pgraph_vk_clear_surface(NV2AState *d, uint32_t parameter) uint32_t clearrectx = pgraph_reg_r(pg, NV_PGRAPH_CLEARRECTX); uint32_t clearrecty = pgraph_reg_r(pg, NV_PGRAPH_CLEARRECTY); - int xmin = GET_MASK(clearrectx, NV_PGRAPH_CLEARRECTX_XMIN); - int xmax = GET_MASK(clearrectx, NV_PGRAPH_CLEARRECTX_XMAX); - int ymin = GET_MASK(clearrecty, NV_PGRAPH_CLEARRECTY_YMIN); - int ymax = GET_MASK(clearrecty, NV_PGRAPH_CLEARRECTY_YMAX); + unsigned int xmin = GET_MASK(clearrectx, NV_PGRAPH_CLEARRECTX_XMIN); + unsigned int xmax = GET_MASK(clearrectx, NV_PGRAPH_CLEARRECTX_XMAX); + unsigned int ymin = GET_MASK(clearrecty, NV_PGRAPH_CLEARRECTY_YMIN); + unsigned int ymax = GET_MASK(clearrecty, NV_PGRAPH_CLEARRECTY_YMAX); NV2A_VK_DGROUP_BEGIN("CLEAR min=(%d,%d) max=(%d,%d)%s%s", xmin, ymin, xmax, ymax, write_color ? " color" : "", @@ -1713,14 +1713,15 @@ void pgraph_vk_clear_surface(NV2AState *d, uint32_t parameter) binding->vram_addr); begin_draw(pg); - // FIXME: What does hardware do when min <= max? + // FIXME: What does hardware do when min >= max? + // FIXME: What does hardware do when min >= surface size? xmin = MIN(xmin, binding->width - 1); ymin = MIN(ymin, binding->height - 1); - xmax = MIN(xmax, binding->width - 1); - ymax = MIN(ymax, binding->height - 1); + xmax = MAX(xmin, MIN(xmax, binding->width - 1)); + ymax = MAX(ymin, MIN(ymax, binding->height - 1)); - int scissor_width = MAX(0, xmax - xmin + 1), - scissor_height = MAX(0, ymax - ymin + 1); + unsigned int scissor_width = MAX(0, xmax - xmin + 1); + unsigned int scissor_height = MAX(0, ymax - ymin + 1); pgraph_apply_anti_aliasing_factor(pg, &xmin, &ymin); pgraph_apply_anti_aliasing_factor(pg, &scissor_width, &scissor_height);