anv: Make border colors the right size and alignment on HSW
Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
This commit is contained in:
parent
51076eb87c
commit
58cb865313
|
@ -1880,6 +1880,25 @@ anv_state_pool_emit_data(struct anv_state_pool *pool, size_t size, size_t align,
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Haswell border color is a bit of a disaster. Float and unorm formats use a
|
||||||
|
* straightforward 32-bit float color in the first 64 bytes. Instead of using
|
||||||
|
* a nice float/integer union like Gen8+, Haswell specifies the integer border
|
||||||
|
* color as a separate entry /after/ the float color. The layout of this entry
|
||||||
|
* also depends on the format's bpp (with extra hacks for RG32), and overlaps.
|
||||||
|
*
|
||||||
|
* Since we don't know the format/bpp, we can't make any of the border colors
|
||||||
|
* containing '1' work for all formats, as it would be in the wrong place for
|
||||||
|
* some of them. We opt to make 32-bit integers work as this seems like the
|
||||||
|
* most common option. Fortunately, transparent black works regardless, as
|
||||||
|
* all zeroes is the same in every bit-size.
|
||||||
|
*/
|
||||||
|
struct hsw_border_color {
|
||||||
|
float float32[4];
|
||||||
|
uint32_t _pad0[12];
|
||||||
|
uint32_t uint32[4];
|
||||||
|
uint32_t _pad1[108];
|
||||||
|
};
|
||||||
|
|
||||||
struct gen8_border_color {
|
struct gen8_border_color {
|
||||||
union {
|
union {
|
||||||
float float32[4];
|
float float32[4];
|
||||||
|
@ -1892,18 +1911,33 @@ struct gen8_border_color {
|
||||||
static void
|
static void
|
||||||
anv_device_init_border_colors(struct anv_device *device)
|
anv_device_init_border_colors(struct anv_device *device)
|
||||||
{
|
{
|
||||||
static const struct gen8_border_color border_colors[] = {
|
if (device->info.is_haswell) {
|
||||||
[VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK] = { .float32 = { 0.0, 0.0, 0.0, 0.0 } },
|
static const struct hsw_border_color border_colors[] = {
|
||||||
[VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK] = { .float32 = { 0.0, 0.0, 0.0, 1.0 } },
|
[VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK] = { .float32 = { 0.0, 0.0, 0.0, 0.0 } },
|
||||||
[VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE] = { .float32 = { 1.0, 1.0, 1.0, 1.0 } },
|
[VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK] = { .float32 = { 0.0, 0.0, 0.0, 1.0 } },
|
||||||
[VK_BORDER_COLOR_INT_TRANSPARENT_BLACK] = { .uint32 = { 0, 0, 0, 0 } },
|
[VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE] = { .float32 = { 1.0, 1.0, 1.0, 1.0 } },
|
||||||
[VK_BORDER_COLOR_INT_OPAQUE_BLACK] = { .uint32 = { 0, 0, 0, 1 } },
|
[VK_BORDER_COLOR_INT_TRANSPARENT_BLACK] = { .uint32 = { 0, 0, 0, 0 } },
|
||||||
[VK_BORDER_COLOR_INT_OPAQUE_WHITE] = { .uint32 = { 1, 1, 1, 1 } },
|
[VK_BORDER_COLOR_INT_OPAQUE_BLACK] = { .uint32 = { 0, 0, 0, 1 } },
|
||||||
};
|
[VK_BORDER_COLOR_INT_OPAQUE_WHITE] = { .uint32 = { 1, 1, 1, 1 } },
|
||||||
|
};
|
||||||
|
|
||||||
device->border_colors = anv_state_pool_emit_data(&device->dynamic_state_pool,
|
device->border_colors =
|
||||||
sizeof(border_colors), 64,
|
anv_state_pool_emit_data(&device->dynamic_state_pool,
|
||||||
border_colors);
|
sizeof(border_colors), 512, border_colors);
|
||||||
|
} else {
|
||||||
|
static const struct gen8_border_color border_colors[] = {
|
||||||
|
[VK_BORDER_COLOR_FLOAT_TRANSPARENT_BLACK] = { .float32 = { 0.0, 0.0, 0.0, 0.0 } },
|
||||||
|
[VK_BORDER_COLOR_FLOAT_OPAQUE_BLACK] = { .float32 = { 0.0, 0.0, 0.0, 1.0 } },
|
||||||
|
[VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE] = { .float32 = { 1.0, 1.0, 1.0, 1.0 } },
|
||||||
|
[VK_BORDER_COLOR_INT_TRANSPARENT_BLACK] = { .uint32 = { 0, 0, 0, 0 } },
|
||||||
|
[VK_BORDER_COLOR_INT_OPAQUE_BLACK] = { .uint32 = { 0, 0, 0, 1 } },
|
||||||
|
[VK_BORDER_COLOR_INT_OPAQUE_WHITE] = { .uint32 = { 1, 1, 1, 1 } },
|
||||||
|
};
|
||||||
|
|
||||||
|
device->border_colors =
|
||||||
|
anv_state_pool_emit_data(&device->dynamic_state_pool,
|
||||||
|
sizeof(border_colors), 64, border_colors);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -341,8 +341,10 @@ VkResult genX(CreateSampler)(
|
||||||
|
|
||||||
sampler->n_planes = 1;
|
sampler->n_planes = 1;
|
||||||
|
|
||||||
|
uint32_t border_color_stride = GEN_IS_HASWELL ? 512 : 64;
|
||||||
uint32_t border_color_offset = device->border_colors.offset +
|
uint32_t border_color_offset = device->border_colors.offset +
|
||||||
pCreateInfo->borderColor * 64;
|
pCreateInfo->borderColor *
|
||||||
|
border_color_stride;
|
||||||
|
|
||||||
#if GEN_GEN >= 9
|
#if GEN_GEN >= 9
|
||||||
unsigned sampler_reduction_mode = STD_FILTER;
|
unsigned sampler_reduction_mode = STD_FILTER;
|
||||||
|
|
Loading…
Reference in New Issue