Archived
1
Fork 0

Initialize all metal objects properly

This commit is contained in:
Joshua Goins 2022-02-15 11:32:33 -05:00
parent 93c2639539
commit c5713938ca

View file

@ -229,7 +229,7 @@ void* GFXMetal::get_buffer_contents(GFXBuffer* buffer) {
GFXTexture* GFXMetal::create_texture(const GFXTextureCreateInfo& info) { GFXTexture* GFXMetal::create_texture(const GFXTextureCreateInfo& info) {
GFXMetalTexture* texture = new GFXMetalTexture(); GFXMetalTexture* texture = new GFXMetalTexture();
MTL::TextureDescriptor* textureDescriptor = MTL::TextureDescriptor::alloc(); MTL::TextureDescriptor* textureDescriptor = MTL::TextureDescriptor::alloc()->init();
MTL::PixelFormat mtlFormat = toPixelFormat(info.format); MTL::PixelFormat mtlFormat = toPixelFormat(info.format);
@ -275,7 +275,8 @@ GFXTexture* GFXMetal::create_texture(const GFXTextureCreateInfo& info) {
textureDescriptor->setPixelFormat(mtlFormat); textureDescriptor->setPixelFormat(mtlFormat);
textureDescriptor->setWidth(info.width); textureDescriptor->setWidth(info.width);
textureDescriptor->setWidth(info.height); textureDescriptor->setHeight(info.height);
textureDescriptor->setDepth(1);
textureDescriptor->setArrayLength(info.array_length); textureDescriptor->setArrayLength(info.array_length);
texture->array_length = info.array_length; texture->array_length = info.array_length;
@ -289,7 +290,7 @@ GFXTexture* GFXMetal::create_texture(const GFXTextureCreateInfo& info) {
texture->width = info.width; texture->width = info.width;
texture->height = info.height; texture->height = info.height;
MTL::SamplerDescriptor* samplerDescriptor = MTL::SamplerDescriptor::alloc(); MTL::SamplerDescriptor* samplerDescriptor = MTL::SamplerDescriptor::alloc()->init();
samplerDescriptor->setMinFilter(MTL::SamplerMinMagFilterLinear); samplerDescriptor->setMinFilter(MTL::SamplerMinMagFilterLinear);
samplerDescriptor->setMagFilter(MTL::SamplerMinMagFilterLinear); samplerDescriptor->setMagFilter(MTL::SamplerMinMagFilterLinear);
samplerDescriptor->setSAddressMode(toSamplingMode(info.samplingMode)); samplerDescriptor->setSAddressMode(toSamplingMode(info.samplingMode));
@ -367,7 +368,7 @@ void GFXMetal::copy_texture(GFXTexture* from, GFXBuffer* to) {
GFXSampler* GFXMetal::create_sampler(const GFXSamplerCreateInfo& info) { GFXSampler* GFXMetal::create_sampler(const GFXSamplerCreateInfo& info) {
GFXMetalSampler* sampler = new GFXMetalSampler(); GFXMetalSampler* sampler = new GFXMetalSampler();
MTL::SamplerDescriptor* samplerDescriptor = MTL::SamplerDescriptor::alloc(); MTL::SamplerDescriptor* samplerDescriptor = MTL::SamplerDescriptor::alloc()->init();
samplerDescriptor->setMinFilter(toFilter(info.min_filter)); samplerDescriptor->setMinFilter(toFilter(info.min_filter));
samplerDescriptor->setMagFilter(toFilter(info.mag_filter)); samplerDescriptor->setMagFilter(toFilter(info.mag_filter));
samplerDescriptor->setSAddressMode(toSamplingMode(info.samplingMode)); samplerDescriptor->setSAddressMode(toSamplingMode(info.samplingMode));
@ -406,7 +407,7 @@ GFXRenderPass* GFXMetal::create_render_pass(const GFXRenderPassCreateInfo& info)
} }
MTL::FunctionConstantValues* get_constant_values(GFXShaderConstants constants) { MTL::FunctionConstantValues* get_constant_values(GFXShaderConstants constants) {
MTL::FunctionConstantValues* constantValues = MTL::FunctionConstantValues::alloc(); MTL::FunctionConstantValues* constantValues = MTL::FunctionConstantValues::alloc()->init();
for(auto& constant : constants) { for(auto& constant : constants) {
switch(constant.type) { switch(constant.type) {
@ -424,7 +425,7 @@ GFXPipeline* GFXMetal::create_graphics_pipeline(const GFXGraphicsPipelineCreateI
NS::Error* error = nil; NS::Error* error = nil;
MTL::RenderPipelineDescriptor* pipelineDescriptor = MTL::RenderPipelineDescriptor::alloc(); MTL::RenderPipelineDescriptor* pipelineDescriptor = MTL::RenderPipelineDescriptor::alloc()->init();
const bool has_vertex_stage = !info.shaders.vertex_src.empty(); const bool has_vertex_stage = !info.shaders.vertex_src.empty();
const bool has_fragment_stage = !info.shaders.fragment_src.empty(); const bool has_fragment_stage = !info.shaders.fragment_src.empty();
@ -493,11 +494,11 @@ GFXPipeline* GFXMetal::create_graphics_pipeline(const GFXGraphicsPipelineCreateI
pipelineDescriptor->setFragmentFunction(fragmentFunc); pipelineDescriptor->setFragmentFunction(fragmentFunc);
} }
MTL::VertexDescriptor* descriptor = MTL::VertexDescriptor::alloc(); MTL::VertexDescriptor* descriptor = MTL::VertexDescriptor::alloc()->init();
int i = 0; int i = 0;
for(auto input : info.vertex_input.inputs) { for(auto input : info.vertex_input.inputs) {
MTL::VertexBufferLayoutDescriptor* inputDescriptor = MTL::VertexBufferLayoutDescriptor::alloc(); MTL::VertexBufferLayoutDescriptor* inputDescriptor = MTL::VertexBufferLayoutDescriptor::alloc()->init();
inputDescriptor->setStride(input.stride); inputDescriptor->setStride(input.stride);
inputDescriptor->setStepFunction(MTL::VertexStepFunctionPerVertex); inputDescriptor->setStepFunction(MTL::VertexStepFunctionPerVertex);
@ -536,7 +537,7 @@ GFXPipeline* GFXMetal::create_graphics_pipeline(const GFXGraphicsPipelineCreateI
break; break;
} }
MTL::VertexAttributeDescriptor* attributeDescriptor = MTL::VertexAttributeDescriptor::alloc(); MTL::VertexAttributeDescriptor* attributeDescriptor = MTL::VertexAttributeDescriptor::alloc()->init();
attributeDescriptor->setFormat(format); attributeDescriptor->setFormat(format);
attributeDescriptor->setBufferIndex(attribute.binding); attributeDescriptor->setBufferIndex(attribute.binding);
attributeDescriptor->setOffset(attribute.offset); attributeDescriptor->setOffset(attribute.offset);
@ -552,7 +553,7 @@ GFXPipeline* GFXMetal::create_graphics_pipeline(const GFXGraphicsPipelineCreateI
unsigned int i = 0; unsigned int i = 0;
for(const auto& attachment : metalRenderPass->attachments) { for(const auto& attachment : metalRenderPass->attachments) {
if(attachment != MTL::PixelFormatDepth32Float) { if(attachment != MTL::PixelFormatDepth32Float) {
MTL::RenderPipelineColorAttachmentDescriptor* colorAttachmentDescriptor = MTL::RenderPipelineColorAttachmentDescriptor::alloc(); MTL::RenderPipelineColorAttachmentDescriptor* colorAttachmentDescriptor = MTL::RenderPipelineColorAttachmentDescriptor::alloc()->init();
colorAttachmentDescriptor->setPixelFormat(attachment); colorAttachmentDescriptor->setPixelFormat(attachment);
colorAttachmentDescriptor->setBlendingEnabled(info.blending.enable_blending); colorAttachmentDescriptor->setBlendingEnabled(info.blending.enable_blending);
@ -569,7 +570,7 @@ GFXPipeline* GFXMetal::create_graphics_pipeline(const GFXGraphicsPipelineCreateI
} }
} }
} else { } else {
MTL::RenderPipelineColorAttachmentDescriptor* colorAttachmentDescriptor = MTL::RenderPipelineColorAttachmentDescriptor::alloc(); MTL::RenderPipelineColorAttachmentDescriptor* colorAttachmentDescriptor = MTL::RenderPipelineColorAttachmentDescriptor::alloc()->init();
//colorAttachmentDescriptor->setPixelFormat(attachment); [nativeViews[0]->layer pixelFormat]; //colorAttachmentDescriptor->setPixelFormat(attachment); [nativeViews[0]->layer pixelFormat];
colorAttachmentDescriptor->setBlendingEnabled(info.blending.enable_blending); colorAttachmentDescriptor->setBlendingEnabled(info.blending.enable_blending);
@ -610,7 +611,7 @@ GFXPipeline* GFXMetal::create_graphics_pipeline(const GFXGraphicsPipelineCreateI
pipeline->winding_mode = info.rasterization.winding_mode; pipeline->winding_mode = info.rasterization.winding_mode;
MTL::DepthStencilDescriptor* depthStencil = MTL::DepthStencilDescriptor::alloc(); MTL::DepthStencilDescriptor* depthStencil = MTL::DepthStencilDescriptor::alloc()->init();
if(info.depth.depth_mode != GFXDepthMode::None) { if(info.depth.depth_mode != GFXDepthMode::None) {
switch(info.depth.depth_mode) { switch(info.depth.depth_mode) {
@ -677,7 +678,7 @@ GFXPipeline* GFXMetal::create_compute_pipeline(const GFXComputePipelineCreateInf
MTL::Function* computeFunc = computeLibrary->newFunction(NS::String::string("main0", NS::ASCIIStringEncoding)); MTL::Function* computeFunc = computeLibrary->newFunction(NS::String::string("main0", NS::ASCIIStringEncoding));
MTL::ComputePipelineDescriptor* pipelineDescriptor = MTL::ComputePipelineDescriptor::alloc(); MTL::ComputePipelineDescriptor* pipelineDescriptor = MTL::ComputePipelineDescriptor::alloc()->init();
pipelineDescriptor->setComputeFunction(computeFunc); pipelineDescriptor->setComputeFunction(computeFunc);
pipeline->threadGroupSize = MTL::Size(info.workgroup_size_x, info.workgroup_size_y, info.workgroup_size_z); pipeline->threadGroupSize = MTL::Size(info.workgroup_size_x, info.workgroup_size_y, info.workgroup_size_z);
@ -771,20 +772,20 @@ void GFXMetal::submit(GFXCommandBuffer* command_buffer, const platform::window_p
break; break;
case CurrentEncoder::Render: case CurrentEncoder::Render:
{ {
MTL::RenderPassDescriptor* descriptor = MTL::RenderPassDescriptor::alloc(); MTL::RenderPassDescriptor* descriptor = MTL::RenderPassDescriptor::alloc()->init();
if(currentRenderPass != nullptr && currentFramebuffer != nullptr) { if(currentRenderPass != nullptr && currentFramebuffer != nullptr) {
unsigned int i = 0; unsigned int i = 0;
for(const auto& attachment : currentFramebuffer->attachments) { for(const auto& attachment : currentFramebuffer->attachments) {
if(attachment->format == MTL::PixelFormatDepth32Float) { if(attachment->format == MTL::PixelFormatDepth32Float) {
MTL::RenderPassDepthAttachmentDescriptor* depthAttachment = MTL::RenderPassDepthAttachmentDescriptor::alloc(); MTL::RenderPassDepthAttachmentDescriptor* depthAttachment = MTL::RenderPassDepthAttachmentDescriptor::alloc()->init();
depthAttachment->setTexture(attachment->handle); depthAttachment->setTexture(attachment->handle);
depthAttachment->setLoadAction(MTL::LoadActionClear); depthAttachment->setLoadAction(MTL::LoadActionClear);
depthAttachment->setStoreAction(MTL::StoreActionStore); depthAttachment->setStoreAction(MTL::StoreActionStore);
descriptor->setDepthAttachment(depthAttachment); descriptor->setDepthAttachment(depthAttachment);
} else { } else {
MTL::RenderPassColorAttachmentDescriptor* colorAttachment = MTL::RenderPassColorAttachmentDescriptor::alloc(); MTL::RenderPassColorAttachmentDescriptor* colorAttachment = MTL::RenderPassColorAttachmentDescriptor::alloc()->init();
colorAttachment->setTexture(attachment->handle); colorAttachment->setTexture(attachment->handle);
colorAttachment->setLoadAction(MTL::LoadActionClear); colorAttachment->setLoadAction(MTL::LoadActionClear);
@ -797,7 +798,7 @@ void GFXMetal::submit(GFXCommandBuffer* command_buffer, const platform::window_p
renderEncoder = commandBuffer->renderCommandEncoder(descriptor); renderEncoder = commandBuffer->renderCommandEncoder(descriptor);
} else { } else {
MTL::RenderPassColorAttachmentDescriptor* colorAttachment = MTL::RenderPassColorAttachmentDescriptor::alloc(); MTL::RenderPassColorAttachmentDescriptor* colorAttachment = MTL::RenderPassColorAttachmentDescriptor::alloc()->init();
//colorAttachment->setTexture(attachment->handle); drawable.texture //colorAttachment->setTexture(attachment->handle); drawable.texture
colorAttachment->setLoadAction(MTL::LoadActionClear); colorAttachment->setLoadAction(MTL::LoadActionClear);