mirror of
https://github.com/love2d/love.git
synced 2026-08-19 20:19:42 +02:00
vulkan: fix shader cross-stage io (varying) location mapping.
This commit is contained in:
@@ -41,6 +41,11 @@ static const uint32_t DESCRIPTOR_POOL_SIZE = 1000;
|
|||||||
class BindingMapper
|
class BindingMapper
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
BindingMapper(spv::Decoration decoration)
|
||||||
|
: decoration(decoration)
|
||||||
|
{}
|
||||||
|
|
||||||
uint32_t operator()(spirv_cross::CompilerGLSL &comp, std::vector<uint32_t> &spirv, const std::string &name, int count, const spirv_cross::ID &id)
|
uint32_t operator()(spirv_cross::CompilerGLSL &comp, std::vector<uint32_t> &spirv, const std::string &name, int count, const spirv_cross::ID &id)
|
||||||
{
|
{
|
||||||
auto it = bindingMappings.find(name);
|
auto it = bindingMappings.find(name);
|
||||||
@@ -58,7 +63,7 @@ public:
|
|||||||
uint32_t freeBinding = getFreeBinding(count);
|
uint32_t freeBinding = getFreeBinding(count);
|
||||||
|
|
||||||
uint32_t binaryBindingOffset;
|
uint32_t binaryBindingOffset;
|
||||||
if (!comp.get_binary_offset_for_decoration(id, spv::DecorationBinding, binaryBindingOffset))
|
if (!comp.get_binary_offset_for_decoration(id, decoration, binaryBindingOffset))
|
||||||
throw love::Exception("could not get binary offset for uniform %s binding", name.c_str());
|
throw love::Exception("could not get binary offset for uniform %s binding", name.c_str());
|
||||||
|
|
||||||
spirv[binaryBindingOffset] = freeBinding;
|
spirv[binaryBindingOffset] = freeBinding;
|
||||||
@@ -73,7 +78,7 @@ public:
|
|||||||
auto binding = (uint32_t)it->second.getOffset();
|
auto binding = (uint32_t)it->second.getOffset();
|
||||||
|
|
||||||
uint32_t binaryBindingOffset;
|
uint32_t binaryBindingOffset;
|
||||||
if (!comp.get_binary_offset_for_decoration(id, spv::DecorationBinding, binaryBindingOffset))
|
if (!comp.get_binary_offset_for_decoration(id, decoration, binaryBindingOffset))
|
||||||
throw love::Exception("could not get binary offset for uniform %s binding", name.c_str());
|
throw love::Exception("could not get binary offset for uniform %s binding", name.c_str());
|
||||||
|
|
||||||
spirv[binaryBindingOffset] = binding;
|
spirv[binaryBindingOffset] = binding;
|
||||||
@@ -104,6 +109,7 @@ private:
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spv::Decoration decoration;
|
||||||
std::map<std::string, Range> bindingMappings;
|
std::map<std::string, Range> bindingMappings;
|
||||||
|
|
||||||
};
|
};
|
||||||
@@ -570,7 +576,8 @@ void Shader::compileShaders()
|
|||||||
if (!program->mapIO())
|
if (!program->mapIO())
|
||||||
throw love::Exception("mapIO failed");
|
throw love::Exception("mapIO failed");
|
||||||
|
|
||||||
BindingMapper bindingMapper;
|
BindingMapper bindingMapper(spv::DecorationBinding);
|
||||||
|
BindingMapper ioLocationMapper(spv::DecorationLocation);
|
||||||
|
|
||||||
for (int i = 0; i < SHADERSTAGE_MAX_ENUM; i++)
|
for (int i = 0; i < SHADERSTAGE_MAX_ENUM; i++)
|
||||||
{
|
{
|
||||||
@@ -711,6 +718,24 @@ void Shader::compileShaders()
|
|||||||
|
|
||||||
attributes[r.name] = index;
|
attributes[r.name] = index;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (const auto &r : shaderResources.stage_outputs)
|
||||||
|
{
|
||||||
|
const auto &type = comp.get_type(r.type_id);
|
||||||
|
int count = type.array.empty() ? 1 : type.array[0];
|
||||||
|
|
||||||
|
ioLocationMapper(comp, spirv, r.name, count, r.id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (shaderStage == SHADERSTAGE_PIXEL)
|
||||||
|
{
|
||||||
|
for (const auto &r : shaderResources.stage_inputs)
|
||||||
|
{
|
||||||
|
const auto &type = comp.get_type(r.type_id);
|
||||||
|
int count = type.array.empty() ? 1 : type.array[0];
|
||||||
|
|
||||||
|
ioLocationMapper(comp, spirv, r.name, count, r.id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
VkShaderModuleCreateInfo createInfo{};
|
VkShaderModuleCreateInfo createInfo{};
|
||||||
|
|||||||
Reference in New Issue
Block a user