shader: separate comparison image bindings

This commit is contained in:
nmzik
2026-09-04 00:47:16 +02:00
parent eb917463ad
commit d762d24f73
4 changed files with 88 additions and 26 deletions
+23 -14
View File
@@ -253,9 +253,10 @@ struct StageOutput {
bool operator==(const StageOutput& other) const = default;
};
inline constexpr uint32_t FirstImageBinding = 1u;
inline constexpr uint32_t FirstStorageImageBinding = 22u;
inline constexpr uint32_t ImageBindingCount = 36u;
inline constexpr uint32_t FirstImageBinding = 1u;
inline constexpr uint32_t FirstDepthComparisonImageBinding = 22u;
inline constexpr uint32_t FirstStorageImageBinding = 29u;
inline constexpr uint32_t ImageBindingCount = 43u;
enum class DescriptorBindingKind : uint32_t {
Buffers = 0u,
@@ -268,8 +269,8 @@ enum class DescriptorBindingKind : uint32_t {
Count,
};
static_assert(static_cast<uint32_t>(DescriptorBindingKind::Samplers) == 37u);
static_assert(static_cast<uint32_t>(DescriptorBindingKind::Count) == 43u);
static_assert(static_cast<uint32_t>(DescriptorBindingKind::Samplers) == 44u);
static_assert(static_cast<uint32_t>(DescriptorBindingKind::Count) == 50u);
struct PushData {
static constexpr uint32_t DwordCount = 32;
@@ -313,9 +314,10 @@ DescriptorBindingForImage(const ImageResource& image) {
constexpr uint32_t SampledFloatBinding = 1u;
constexpr uint32_t SampledUintBinding = 8u;
constexpr uint32_t SampledSintBinding = 15u;
constexpr uint32_t StorageFloatBinding = 22u;
constexpr uint32_t StorageUintBinding = 27u;
constexpr uint32_t AtomicUintBinding = 32u;
constexpr uint32_t SampledDepthBinding = FirstDepthComparisonImageBinding;
constexpr uint32_t StorageFloatBinding = FirstStorageImageBinding;
constexpr uint32_t StorageUintBinding = 34u;
constexpr uint32_t AtomicUintBinding = 39u;
uint32_t base = 0;
bool sampled = false;
@@ -324,12 +326,19 @@ DescriptorBindingForImage(const ImageResource& image) {
return std::nullopt;
}
sampled = true;
switch (image.numeric_class) {
case Prospero::TextureNumericClass::Float: base = SampledFloatBinding; break;
case Prospero::TextureNumericClass::Uint: base = SampledUintBinding; break;
case Prospero::TextureNumericClass::Sint: base = SampledSintBinding; break;
case Prospero::TextureNumericClass::Unsupported: return std::nullopt;
default: return std::nullopt;
if (image.depth_compare) {
if (image.numeric_class != Prospero::TextureNumericClass::Float) {
return std::nullopt;
}
base = SampledDepthBinding;
} else {
switch (image.numeric_class) {
case Prospero::TextureNumericClass::Float: base = SampledFloatBinding; break;
case Prospero::TextureNumericClass::Uint: base = SampledUintBinding; break;
case Prospero::TextureNumericClass::Sint: base = SampledSintBinding; break;
case Prospero::TextureNumericClass::Unsupported: return std::nullopt;
default: return std::nullopt;
}
}
} else if (image.resource_class == ImageResourceClass::Storage) {
if (image.atomic) {