nv2a/vk: Fix integer format border color

This commit is contained in:
Matt Borgerson 2024-07-26 17:21:02 -07:00 committed by mborgerson
parent b9e68a760b
commit c63cdc18de
1 changed files with 21 additions and 16 deletions

View File

@ -1192,27 +1192,36 @@ static void create_texture(PGRAPHState *pg, int texture_idx)
uint32_t border_color_pack32 =
pgraph_reg_r(pg, NV_PGRAPH_BORDERCOLOR0 + texture_idx * 4);
if (r->custom_border_color_extension_enabled) {
float border_color_rgba[4];
pgraph_argb_pack32_to_rgba_float(border_color_pack32, border_color_rgba);
bool is_integer_type = vkf.vk_format == VK_FORMAT_R32_UINT;
if (r->custom_border_color_extension_enabled) {
vk_border_color = is_integer_type ? VK_BORDER_COLOR_INT_CUSTOM_EXT :
VK_BORDER_COLOR_FLOAT_CUSTOM_EXT;
custom_border_color_create_info =
(VkSamplerCustomBorderColorCreateInfoEXT){
.sType =
VK_STRUCTURE_TYPE_SAMPLER_CUSTOM_BORDER_COLOR_CREATE_INFO_EXT,
.customBorderColor.float32 = { border_color_rgba[0],
border_color_rgba[1],
border_color_rgba[2],
border_color_rgba[3] },
.format = image_view_create_info.format,
.pNext = sampler_next_struct
};
vk_border_color = VK_BORDER_COLOR_FLOAT_CUSTOM_EXT;
if (is_integer_type) {
float rgba[4];
pgraph_argb_pack32_to_rgba_float(border_color_pack32, rgba);
for (int i = 0; i < 4; i++) {
custom_border_color_create_info.customBorderColor.uint32[i] =
(uint32_t)((double)rgba[i] * (double)0xffffffff);
}
} else {
pgraph_argb_pack32_to_rgba_float(
border_color_pack32,
custom_border_color_create_info.customBorderColor.float32);
}
sampler_next_struct = &custom_border_color_create_info;
} else {
// FIXME: Handle custom color in shader
if (border_color_pack32 == 0x00000000) {
if (is_integer_type) {
vk_border_color = VK_BORDER_COLOR_INT_TRANSPARENT_BLACK;
} else if (border_color_pack32 == 0x00000000) {
vk_border_color = VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK;
} else if (border_color_pack32 == 0xff000000) {
vk_border_color = VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK;
@ -1221,11 +1230,6 @@ static void create_texture(PGRAPHState *pg, int texture_idx)
}
}
if (vkf.vk_format == VK_FORMAT_R32_UINT) {
// Border color type must match sampled type
vk_border_color = VK_BORDER_COLOR_INT_OPAQUE_BLACK;
}
uint32_t filter = pgraph_reg_r(pg, NV_PGRAPH_TEXFILTER0 + texture_idx * 4);
if (filter & NV_PGRAPH_TEXFILTER0_ASIGNED)
NV2A_UNIMPLEMENTED("NV_PGRAPH_TEXFILTER0_ASIGNED");
@ -1248,7 +1252,8 @@ static void create_texture(PGRAPHState *pg, int texture_idx)
vk_min_filter = pgraph_texture_min_filter_vk_map[min_filter];
if (f_basic.linear && vk_mag_filter != vk_min_filter) {
// Per spec, if coordinates unnormalized, filters must be same
// FIXME: Per spec, if coordinates unnormalized, filters must be
// same.
vk_mag_filter = vk_min_filter = VK_FILTER_LINEAR;
}
} else {