Fix a bunch of Metal backend errors
This commit is contained in:
parent
fcbf526615
commit
f4090d2b24
1 changed files with 24 additions and 27 deletions
|
@ -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);
|
||||
}
|
||||
|
|
Reference in a new issue