Archived
1
Fork 0

Fix a bunch of Metal backend errors

This commit is contained in:
Joshua Goins 2022-02-15 12:33:01 -05:00
parent fcbf526615
commit f4090d2b24

View file

@ -261,7 +261,11 @@ GFXTexture* GFXMetal::create_texture(const GFXTextureCreateInfo& info) {
#if defined(PLATFORM_IOS) || defined(PLATFORM_TVOS)
textureDescriptor->setStorageMode(MTL::StorageModeShared);
#else
if(info.format == GFXPixelFormat::DEPTH_32F) {
textureDescriptor->setStorageMode(MTL::StorageModePrivate);
} else {
textureDescriptor->setStorageMode(MTL::StorageModeManaged);
}
#endif
}
@ -430,6 +434,7 @@ GFXPipeline* GFXMetal::create_graphics_pipeline(const GFXGraphicsPipelineCreateI
const bool has_vertex_stage = !info.shaders.vertex_src.empty();
const bool has_fragment_stage = !info.shaders.fragment_src.empty();
MTL::Function* vertexFunc;
if(has_vertex_stage) {
MTL::Library* vertexLibrary;
{
@ -437,7 +442,7 @@ GFXPipeline* GFXMetal::create_graphics_pipeline(const GFXGraphicsPipelineCreateI
if(info.shaders.vertex_src.is_string()) {
vertex_src = info.shaders.vertex_src.as_string();
} else {
const auto vertex_path = info.shaders.vertex_src.as_path().string();
const auto vertex_path = info.shaders.vertex_src.as_path().string() + ".msl";
auto file = prism::open_file(prism::internal_domain / vertex_path);
if(file != std::nullopt) {
@ -447,13 +452,13 @@ GFXPipeline* GFXMetal::create_graphics_pipeline(const GFXGraphicsPipelineCreateI
}
}
vertexLibrary = device->newLibrary(NS::String::string(vertex_src.c_str(), NS::ASCIIStringEncoding), &error);
vertexLibrary = device->newLibrary(NS::String::string(vertex_src.c_str(), NS::ASCIIStringEncoding), nullptr,&error);
if(vertexLibrary == nullptr)
prism::log("Metal shader compiler error: {}", error->debugDescription()->cString(NS::ASCIIStringEncoding));
auto vertex_constants = get_constant_values(info.shaders.vertex_constants);
MTL::Function* vertexFunc = vertexLibrary->newFunction(NS::String::string("main0", NS::ASCIIStringEncoding), vertex_constants, (NS::Error**)nullptr);
vertexFunc = vertexLibrary->newFunction(NS::String::string("main0", NS::ASCIIStringEncoding), vertex_constants, (NS::Error**)nullptr);
if(debug_enabled && info.shaders.vertex_src.is_path())
vertexFunc->setLabel(NS::String::string(info.shaders.vertex_src.as_path().string().data(), NS::ASCIIStringEncoding));
@ -462,6 +467,7 @@ GFXPipeline* GFXMetal::create_graphics_pipeline(const GFXGraphicsPipelineCreateI
}
}
MTL::Function* fragmentFunc;
if(has_fragment_stage) {
MTL::Library* fragmentLibrary;
{
@ -469,7 +475,7 @@ GFXPipeline* GFXMetal::create_graphics_pipeline(const GFXGraphicsPipelineCreateI
if(info.shaders.fragment_src.is_string()) {
fragment_src = info.shaders.fragment_src.as_string();
} else {
const auto fragment_path = info.shaders.fragment_src.as_path().string();
const auto fragment_path = info.shaders.fragment_src.as_path().string() + ".msl";
auto file = prism::open_file(prism::internal_domain / fragment_path);
if(file != std::nullopt) {
@ -479,14 +485,14 @@ GFXPipeline* GFXMetal::create_graphics_pipeline(const GFXGraphicsPipelineCreateI
}
}
fragmentLibrary = device->newLibrary(NS::String::string(fragment_src.c_str(), NS::ASCIIStringEncoding), &error);
fragmentLibrary = device->newLibrary(NS::String::string(fragment_src.c_str(), NS::ASCIIStringEncoding), nullptr,&error);
if(fragmentLibrary == nullptr)
prism::log("Metal shader compiler error: {}", error->debugDescription()->cString(NS::ASCIIStringEncoding));
}
auto fragment_constants = get_constant_values(info.shaders.fragment_constants);
MTL::Function* fragmentFunc = fragmentLibrary->newFunction(NS::String::string("main0", NS::ASCIIStringEncoding), fragment_constants, (NS::Error**)nullptr);
fragmentFunc = fragmentLibrary->newFunction(NS::String::string("main0", NS::ASCIIStringEncoding), fragment_constants, (NS::Error**)nullptr);
if(debug_enabled && info.shaders.fragment_src.is_path())
fragmentFunc->setLabel(NS::String::string(info.shaders.fragment_src.as_path().string().data(), NS::ASCIIStringEncoding));
@ -496,24 +502,19 @@ GFXPipeline* GFXMetal::create_graphics_pipeline(const GFXGraphicsPipelineCreateI
MTL::VertexDescriptor* descriptor = MTL::VertexDescriptor::alloc()->init();
int i = 0;
for(auto input : info.vertex_input.inputs) {
MTL::VertexBufferLayoutDescriptor* inputDescriptor = MTL::VertexBufferLayoutDescriptor::alloc()->init();
MTL::VertexBufferLayoutDescriptor* inputDescriptor = descriptor->layouts()->object(input.location);
inputDescriptor->setStride(input.stride);
inputDescriptor->setStepFunction(MTL::VertexStepFunctionPerVertex);
descriptor->layouts()->setObject(inputDescriptor, i);
inputDescriptor->setStepRate(1);
GFXMetalPipeline::VertexStride vs;
vs.location = input.location;
vs.stride = input.stride;
pipeline->vertexStrides.push_back(vs);
i++;
}
i = 0;
for(auto attribute : info.vertex_input.attributes) {
MTL::VertexFormat format = MTL::VertexFormatFloat3;
switch(attribute.format) {
@ -537,16 +538,14 @@ GFXPipeline* GFXMetal::create_graphics_pipeline(const GFXGraphicsPipelineCreateI
break;
}
MTL::VertexAttributeDescriptor* attributeDescriptor = MTL::VertexAttributeDescriptor::alloc()->init();
MTL::VertexAttributeDescriptor* attributeDescriptor = descriptor->attributes()->object(attribute.location);
attributeDescriptor->setFormat(format);
attributeDescriptor->setBufferIndex(attribute.binding);
attributeDescriptor->setOffset(attribute.offset);
descriptor->attributes()->setObject(attributeDescriptor, i);
i++;
}
pipelineDescriptor->setVertexDescriptor(descriptor);
if(info.render_pass != nullptr) {
GFXMetalRenderPass* metalRenderPass = (GFXMetalRenderPass*)info.render_pass;
@ -584,8 +583,6 @@ GFXPipeline* GFXMetal::create_graphics_pipeline(const GFXGraphicsPipelineCreateI
pipelineDescriptor->colorAttachments()->setObject(colorAttachmentDescriptor, 0);
}
pipelineDescriptor->setVertexDescriptor(descriptor);
if(debug_enabled) {
pipelineDescriptor->setLabel(NS::String::string(info.label.data(), NS::ASCIIStringEncoding));
pipeline->label = info.label;
@ -661,7 +658,7 @@ GFXPipeline* GFXMetal::create_compute_pipeline(const GFXComputePipelineCreateInf
if(info.compute_src.is_string()) {
compute_src = info.compute_src.as_string();
} else {
const auto compute_path = info.compute_src.as_path().string();
const auto compute_path = info.compute_src.as_path().string() + ".msl";
auto file = prism::open_file(prism::internal_domain / compute_path);
if(file != std::nullopt) {
@ -671,7 +668,7 @@ GFXPipeline* GFXMetal::create_compute_pipeline(const GFXComputePipelineCreateInf
}
}
computeLibrary = device->newLibrary(NS::String::string(compute_src.c_str(), NS::ASCIIStringEncoding), &error);
computeLibrary = device->newLibrary(NS::String::string(compute_src.c_str(), NS::ASCIIStringEncoding), nullptr, &error);
if(!computeLibrary)
prism::log("Compute library compilation error: {}", error->debugDescription()->cString(NS::ASCIIStringEncoding));
}
@ -689,7 +686,7 @@ GFXPipeline* GFXMetal::create_compute_pipeline(const GFXComputePipelineCreateInf
}
pipeline->compute_handle = device->newComputePipelineState(pipelineDescriptor, MTL::PipelineOptionNone, nullptr, &error);
if(!pipeline->handle)
if(!pipeline->compute_handle)
prism::log("Compute pipeline error: {}", error->debugDescription()->cString(NS::ASCIIStringEncoding));
for(auto& binding : info.shader_input.bindings) {
@ -953,7 +950,7 @@ void GFXMetal::submit(GFXCommandBuffer* command_buffer, const platform::window_p
renderEncoder->drawPrimitives(currentPipeline->primitiveType,
command.data.draw.vertex_offset,
command.data.draw.vertex_offset,
command.data.draw.vertex_count,
command.data.draw.instance_count,
command.data.draw.base_instance);
}