WIP: Vulkan: Workbench #107886

Closed
Jeroen Bakker wants to merge 88 commits from Jeroen-Bakker:vulkan-draw-manager-workbench into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
3 changed files with 41 additions and 20 deletions
Showing only changes of commit 4ecf13457f - Show all commits

View File

@ -396,13 +396,11 @@ static void test_texture_roundtrip__GPU_DATA_FLOAT__GPU_RGB9_E5()
GPU_TEST(texture_roundtrip__GPU_DATA_FLOAT__GPU_RGB9_E5); GPU_TEST(texture_roundtrip__GPU_DATA_FLOAT__GPU_RGB9_E5);
#endif #endif
#if RUN_UNSUPPORTED
static void test_texture_roundtrip__GPU_DATA_FLOAT__GPU_DEPTH_COMPONENT32F() static void test_texture_roundtrip__GPU_DATA_FLOAT__GPU_DEPTH_COMPONENT32F()
{ {
texture_create_upload_read_with_bias<GPU_DEPTH_COMPONENT32F, GPU_DATA_FLOAT>(0.0f); texture_create_upload_read_with_bias<GPU_DEPTH_COMPONENT32F, GPU_DATA_FLOAT>(0.0f);
} }
GPU_TEST(texture_roundtrip__GPU_DATA_FLOAT__GPU_DEPTH_COMPONENT32F); GPU_TEST(texture_roundtrip__GPU_DATA_FLOAT__GPU_DEPTH_COMPONENT32F);
#endif
static void test_texture_roundtrip__GPU_DATA_FLOAT__GPU_DEPTH_COMPONENT24() static void test_texture_roundtrip__GPU_DATA_FLOAT__GPU_DEPTH_COMPONENT24()
{ {
@ -590,7 +588,6 @@ static void test_texture_roundtrip__GPU_DATA_UINT__GPU_R32UI()
} }
GPU_TEST(texture_roundtrip__GPU_DATA_UINT__GPU_R32UI); GPU_TEST(texture_roundtrip__GPU_DATA_UINT__GPU_R32UI);
#if RUN_UNSUPPORTED
static void test_texture_roundtrip__GPU_DATA_UINT__GPU_DEPTH32F_STENCIL8() static void test_texture_roundtrip__GPU_DATA_UINT__GPU_DEPTH32F_STENCIL8()
{ {
texture_create_upload_read<GPU_DEPTH32F_STENCIL8, GPU_DATA_UINT, uint32_t>(); texture_create_upload_read<GPU_DEPTH32F_STENCIL8, GPU_DATA_UINT, uint32_t>();
@ -602,7 +599,6 @@ static void test_texture_roundtrip__GPU_DATA_UINT__GPU_DEPTH24_STENCIL8()
texture_create_upload_read<GPU_DEPTH24_STENCIL8, GPU_DATA_UINT, uint32_t>(); texture_create_upload_read<GPU_DEPTH24_STENCIL8, GPU_DATA_UINT, uint32_t>();
} }
GPU_TEST(texture_roundtrip__GPU_DATA_UINT__GPU_DEPTH24_STENCIL8); GPU_TEST(texture_roundtrip__GPU_DATA_UINT__GPU_DEPTH24_STENCIL8);
#endif
#if RUN_UNSUPPORTED #if RUN_UNSUPPORTED
static void test_texture_roundtrip__GPU_DATA_UINT__GPU_RGB8UI() static void test_texture_roundtrip__GPU_DATA_UINT__GPU_RGB8UI()
@ -630,13 +626,13 @@ static void test_texture_roundtrip__GPU_DATA_UINT__GPU_DEPTH_COMPONENT24()
} }
GPU_TEST(texture_roundtrip__GPU_DATA_UINT__GPU_DEPTH_COMPONENT24); GPU_TEST(texture_roundtrip__GPU_DATA_UINT__GPU_DEPTH_COMPONENT24);
#if RUN_COMPONENT_UNIMPLEMENTED
static void test_texture_roundtrip__GPU_DATA_UINT__GPU_DEPTH_COMPONENT32F() static void test_texture_roundtrip__GPU_DATA_UINT__GPU_DEPTH_COMPONENT32F()
{ {
texture_create_upload_read<GPU_DEPTH_COMPONENT32F, GPU_DATA_UINT, uint32_t>(); texture_create_upload_read<GPU_DEPTH_COMPONENT32F, GPU_DATA_UINT, uint32_t>();
} }
GPU_TEST(texture_roundtrip__GPU_DATA_UINT__GPU_DEPTH_COMPONENT32F); GPU_TEST(texture_roundtrip__GPU_DATA_UINT__GPU_DEPTH_COMPONENT32F);
#if RUN_COMPONENT_UNIMPLEMENTED
static void test_texture_roundtrip__GPU_DATA_UINT__GPU_DEPTH_COMPONENT16() static void test_texture_roundtrip__GPU_DATA_UINT__GPU_DEPTH_COMPONENT16()
{ {
texture_create_upload_read<GPU_DEPTH_COMPONENT16, GPU_DATA_UINT, uint32_t>(); texture_create_upload_read<GPU_DEPTH_COMPONENT16, GPU_DATA_UINT, uint32_t>();

View File

@ -31,6 +31,9 @@ enum class ConversionType {
FLOAT_TO_SNORM16, FLOAT_TO_SNORM16,
SNORM16_TO_FLOAT, SNORM16_TO_FLOAT,
FLOAT_TO_UNORM32,
UNORM32_TO_FLOAT,
UI32_TO_UI16, UI32_TO_UI16,
UI16_TO_UI32, UI16_TO_UI32,
@ -252,6 +255,10 @@ static ConversionType type_of_conversion_uint(eGPUTextureFormat device_format)
case GPU_R8UI: case GPU_R8UI:
return ConversionType::UI32_TO_UI8; return ConversionType::UI32_TO_UI8;
case GPU_DEPTH_COMPONENT32F:
case GPU_DEPTH32F_STENCIL8:
return ConversionType::UNORM32_TO_FLOAT;
case GPU_RGBA8I: case GPU_RGBA8I:
case GPU_RGBA8: case GPU_RGBA8:
case GPU_RGBA16I: case GPU_RGBA16I:
@ -276,7 +283,6 @@ static ConversionType type_of_conversion_uint(eGPUTextureFormat device_format)
case GPU_RGB10_A2: case GPU_RGB10_A2:
case GPU_RGB10_A2UI: case GPU_RGB10_A2UI:
case GPU_R11F_G11F_B10F: case GPU_R11F_G11F_B10F:
case GPU_DEPTH32F_STENCIL8:
case GPU_DEPTH24_STENCIL8: case GPU_DEPTH24_STENCIL8:
case GPU_SRGB8_A8: case GPU_SRGB8_A8:
case GPU_RGBA8_SNORM: case GPU_RGBA8_SNORM:
@ -304,7 +310,6 @@ static ConversionType type_of_conversion_uint(eGPUTextureFormat device_format)
case GPU_RGBA8_DXT5: case GPU_RGBA8_DXT5:
case GPU_SRGB8: case GPU_SRGB8:
case GPU_RGB9_E5: case GPU_RGB9_E5:
case GPU_DEPTH_COMPONENT32F:
case GPU_DEPTH_COMPONENT16: case GPU_DEPTH_COMPONENT16:
return ConversionType::UNSUPPORTED; return ConversionType::UNSUPPORTED;
} }
@ -522,6 +527,7 @@ static ConversionType reversed(ConversionType type)
CASE_PAIR(FLOAT, SNORM8) CASE_PAIR(FLOAT, SNORM8)
CASE_PAIR(FLOAT, UNORM16) CASE_PAIR(FLOAT, UNORM16)
CASE_PAIR(FLOAT, SNORM16) CASE_PAIR(FLOAT, SNORM16)
CASE_PAIR(FLOAT, UNORM32)
CASE_PAIR(UI32, UI16) CASE_PAIR(UI32, UI16)
CASE_PAIR(I32, I16) CASE_PAIR(I32, I16)
CASE_PAIR(UI32, UI8) CASE_PAIR(UI32, UI8)
@ -630,6 +636,7 @@ template<typename InnerType> struct SignedNormalized {
template<typename InnerType> struct UnsignedNormalized { template<typename InnerType> struct UnsignedNormalized {
static_assert(std::is_same<InnerType, uint8_t>() || std::is_same<InnerType, uint16_t>() || static_assert(std::is_same<InnerType, uint8_t>() || std::is_same<InnerType, uint16_t>() ||
std::is_same<InnerType, uint32_t>() ||
std::is_same<InnerType, DepthComponent24>()); std::is_same<InnerType, DepthComponent24>());
InnerType value; InnerType value;
@ -643,15 +650,24 @@ template<typename InnerType> struct UnsignedNormalized {
} }
} }
static constexpr int32_t scalar() static constexpr uint32_t scalar()
{ {
if constexpr (std::is_same<InnerType, DepthComponent24>()) {
return (1 << (used_byte_size() * 8)) - 1; return (1 << (used_byte_size() * 8)) - 1;
}
else {
return std::numeric_limits<InnerType>::max();
}
} }
static constexpr int32_t max() static constexpr uint32_t max()
{ {
return ((1 << (used_byte_size() * 8)) - 1); if constexpr (std::is_same<InnerType, DepthComponent24>()) {
return (1 << (used_byte_size() * 8)) - 1;
}
else {
return std::numeric_limits<InnerType>::max();
}
} }
}; };
@ -672,15 +688,15 @@ template<typename StorageType> void convert(F32 &dst, const SignedNormalized<Sto
template<typename StorageType> void convert(UnsignedNormalized<StorageType> &dst, const F32 &src) template<typename StorageType> void convert(UnsignedNormalized<StorageType> &dst, const F32 &src)
{ {
static constexpr int32_t scalar = UnsignedNormalized<StorageType>::scalar(); static constexpr uint32_t scalar = UnsignedNormalized<StorageType>::scalar();
static constexpr int32_t max = scalar; static constexpr uint32_t max = scalar;
dst.value = (clamp_i((src.value * scalar), 0, max)); dst.value = (clamp_f((src.value * scalar), 0, max));
} }
template<typename StorageType> void convert(F32 &dst, const UnsignedNormalized<StorageType> &src) template<typename StorageType> void convert(F32 &dst, const UnsignedNormalized<StorageType> &src)
{ {
static constexpr int32_t scalar = UnsignedNormalized<StorageType>::scalar(); static constexpr uint32_t scalar = UnsignedNormalized<StorageType>::scalar();
dst.value = float(int32_t(src.value)) / scalar; dst.value = float(uint32_t(src.value)) / scalar;
} }
/* Copy the contents of src to dst with out performing any actual conversion. */ /* Copy the contents of src to dst with out performing any actual conversion. */
@ -858,6 +874,15 @@ static void convert_buffer(void *dst_memory,
dst_memory, src_memory, buffer_size, device_format); dst_memory, src_memory, buffer_size, device_format);
break; break;
case ConversionType::FLOAT_TO_UNORM32:
convert_per_component<UnsignedNormalized<uint32_t>, F32>(
dst_memory, src_memory, buffer_size, device_format);
break;
case ConversionType::UNORM32_TO_FLOAT:
convert_per_component<F32, UnsignedNormalized<uint32_t>>(
dst_memory, src_memory, buffer_size, device_format);
break;
case ConversionType::FLOAT_TO_HALF: case ConversionType::FLOAT_TO_HALF:
convert_per_component<F16, F32>(dst_memory, src_memory, buffer_size, device_format); convert_per_component<F16, F32>(dst_memory, src_memory, buffer_size, device_format);
break; break;

View File

@ -118,9 +118,9 @@ void VKVertexBuffer::resize_data()
void VKVertexBuffer::release_data() void VKVertexBuffer::release_data()
{ {
if (should_unbind_) { VKContext *context = VKContext::get();
VKContext &context = *VKContext::get(); if (should_unbind_ && context) {
context.state_manager_get().texel_buffer_unbind(this); context->state_manager_get().texel_buffer_unbind(this);
} }
if (vk_buffer_view_ != VK_NULL_HANDLE) { if (vk_buffer_view_ != VK_NULL_HANDLE) {