|
|
|
@ -74,20 +74,19 @@ spv::ImageFormat GetImageFormat(ImageFormat format) {
|
|
|
|
|
throw InvalidArgument("Invalid image format {}", format);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Id ImageType(EmitContext& ctx, const ImageDescriptor& desc) {
|
|
|
|
|
Id ImageType(EmitContext& ctx, const ImageDescriptor& desc, Id sampled_type) {
|
|
|
|
|
const spv::ImageFormat format{GetImageFormat(desc.format)};
|
|
|
|
|
const Id type{ctx.U32[1]};
|
|
|
|
|
switch (desc.type) {
|
|
|
|
|
case TextureType::Color1D:
|
|
|
|
|
return ctx.TypeImage(type, spv::Dim::Dim1D, false, false, false, 2, format);
|
|
|
|
|
return ctx.TypeImage(sampled_type, spv::Dim::Dim1D, false, false, false, 2, format);
|
|
|
|
|
case TextureType::ColorArray1D:
|
|
|
|
|
return ctx.TypeImage(type, spv::Dim::Dim1D, false, true, false, 2, format);
|
|
|
|
|
return ctx.TypeImage(sampled_type, spv::Dim::Dim1D, false, true, false, 2, format);
|
|
|
|
|
case TextureType::Color2D:
|
|
|
|
|
return ctx.TypeImage(type, spv::Dim::Dim2D, false, false, false, 2, format);
|
|
|
|
|
return ctx.TypeImage(sampled_type, spv::Dim::Dim2D, false, false, false, 2, format);
|
|
|
|
|
case TextureType::ColorArray2D:
|
|
|
|
|
return ctx.TypeImage(type, spv::Dim::Dim2D, false, true, false, 2, format);
|
|
|
|
|
return ctx.TypeImage(sampled_type, spv::Dim::Dim2D, false, true, false, 2, format);
|
|
|
|
|
case TextureType::Color3D:
|
|
|
|
|
return ctx.TypeImage(type, spv::Dim::Dim3D, false, false, false, 2, format);
|
|
|
|
|
return ctx.TypeImage(sampled_type, spv::Dim::Dim3D, false, false, false, 2, format);
|
|
|
|
|
case TextureType::Buffer:
|
|
|
|
|
throw NotImplementedException("Image buffer");
|
|
|
|
|
default:
|
|
|
|
@ -1273,7 +1272,9 @@ void EmitContext::DefineImageBuffers(const Info& info, u32& binding) {
|
|
|
|
|
throw NotImplementedException("Array of image buffers");
|
|
|
|
|
}
|
|
|
|
|
const spv::ImageFormat format{GetImageFormat(desc.format)};
|
|
|
|
|
const Id image_type{TypeImage(U32[1], spv::Dim::Buffer, false, false, false, 2, format)};
|
|
|
|
|
const Id sampled_type{desc.is_integer ? U32[1] : F32[1]};
|
|
|
|
|
const Id image_type{
|
|
|
|
|
TypeImage(sampled_type, spv::Dim::Buffer, false, false, false, 2, format)};
|
|
|
|
|
const Id pointer_type{TypePointer(spv::StorageClass::UniformConstant, image_type)};
|
|
|
|
|
const Id id{AddGlobalVariable(pointer_type, spv::StorageClass::UniformConstant)};
|
|
|
|
|
Decorate(id, spv::Decoration::Binding, binding);
|
|
|
|
@ -1283,6 +1284,7 @@ void EmitContext::DefineImageBuffers(const Info& info, u32& binding) {
|
|
|
|
|
.id = id,
|
|
|
|
|
.image_type = image_type,
|
|
|
|
|
.count = desc.count,
|
|
|
|
|
.is_integer = desc.is_integer,
|
|
|
|
|
});
|
|
|
|
|
if (profile.supported_spirv >= 0x00010400) {
|
|
|
|
|
interfaces.push_back(id);
|
|
|
|
@ -1327,7 +1329,8 @@ void EmitContext::DefineImages(const Info& info, u32& binding, u32& scaling_inde
|
|
|
|
|
if (desc.count != 1) {
|
|
|
|
|
throw NotImplementedException("Array of images");
|
|
|
|
|
}
|
|
|
|
|
const Id image_type{ImageType(*this, desc)};
|
|
|
|
|
const Id sampled_type{desc.is_integer ? U32[1] : F32[1]};
|
|
|
|
|
const Id image_type{ImageType(*this, desc, sampled_type)};
|
|
|
|
|
const Id pointer_type{TypePointer(spv::StorageClass::UniformConstant, image_type)};
|
|
|
|
|
const Id id{AddGlobalVariable(pointer_type, spv::StorageClass::UniformConstant)};
|
|
|
|
|
Decorate(id, spv::Decoration::Binding, binding);
|
|
|
|
@ -1337,6 +1340,7 @@ void EmitContext::DefineImages(const Info& info, u32& binding, u32& scaling_inde
|
|
|
|
|
.id = id,
|
|
|
|
|
.image_type = image_type,
|
|
|
|
|
.count = desc.count,
|
|
|
|
|
.is_integer = desc.is_integer,
|
|
|
|
|
});
|
|
|
|
|
if (profile.supported_spirv >= 0x00010400) {
|
|
|
|
|
interfaces.push_back(id);
|
|
|
|
|