diff --git a/engine/gfx/metal/src/gfx_metal.cpp b/engine/gfx/metal/src/gfx_metal.cpp index bde33eb..dc51ae6 100755 --- a/engine/gfx/metal/src/gfx_metal.cpp +++ b/engine/gfx/metal/src/gfx_metal.cpp @@ -261,7 +261,11 @@ GFXTexture* GFXMetal::create_texture(const GFXTextureCreateInfo& info) { #if defined(PLATFORM_IOS) || defined(PLATFORM_TVOS) textureDescriptor->setStorageMode(MTL::StorageModeShared); #else - textureDescriptor->setStorageMode(MTL::StorageModeManaged); + if(info.format == GFXPixelFormat::DEPTH_32F) { + textureDescriptor->setStorageMode(MTL::StorageModePrivate); + } else { + textureDescriptor->setStorageMode(MTL::StorageModeManaged); + } #endif } @@ -429,7 +433,8 @@ 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)); @@ -461,7 +466,8 @@ GFXPipeline* GFXMetal::create_graphics_pipeline(const GFXGraphicsPipelineCreateI pipelineDescriptor->setVertexFunction(vertexFunc); } } - + + 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); }