diff --git a/projects/apis/metal/src/commands/commands/metal_commands.m b/projects/apis/metal/src/commands/commands/metal_commands.m index ea3bf32..a0c29d6 100644 --- a/projects/apis/metal/src/commands/commands/metal_commands.m +++ b/projects/apis/metal/src/commands/commands/metal_commands.m @@ -120,12 +120,12 @@ void metalBindUniform(gnCommandBufferHandle buffer, gnUniform uniform, uint32_t ]; } else if (uniform->uniform->bindings[i].type == GN_IMAGE_DESCRIPTOR) { gnImageUniformInfo info = *(gnImageUniformInfo*)uniform->uniform->bindings[i].data; - [encoder setFragmentTexture:info.texture->texture->texture atIndex:(info.binding + 1)]; + [encoder setFragmentTexture:info.texture->texture->texture atIndex:0]; } } } void metalBindVertexBytes(gnCommandBufferHandle buffer, gnPushConstantLayout layout, void* data) { id encoder = (id)buffer->commandBuffer->encoder; - [encoder setVertexBytes:data length:layout.size atIndex:0]; // TODO: fix this + // [encoder setVertexBytes:data length:layout.size atIndex:0]; // TODO: fix this } diff --git a/projects/apis/metal/src/pipelines/graphics_pipeline/metal_graphics_pipeline.m b/projects/apis/metal/src/pipelines/graphics_pipeline/metal_graphics_pipeline.m index edd3dae..c9fccfd 100644 --- a/projects/apis/metal/src/pipelines/graphics_pipeline/metal_graphics_pipeline.m +++ b/projects/apis/metal/src/pipelines/graphics_pipeline/metal_graphics_pipeline.m @@ -4,6 +4,8 @@ #include "shader_module/metal_shader_module.h" #include "surface/metal_surface.h" +#include "utils/math/gryphn_vec3.h" + MTLBlendFactor mtlGryphnBlendFactor(gnBlendFactor factor) { switch (factor) { case GN_BLEND_FACTOR_ZERO: return MTLBlendFactorZero; @@ -71,16 +73,32 @@ gnReturnCode createMetalGraphicsPipeline(gnGraphicsPipeline graphicsPipeline, gn MTLVertexAttributeDescriptorArray* attributes = vertexDescriptor.attributes; MTLVertexBufferLayoutDescriptorArray* buffers = vertexDescriptor.layouts; - int k = 0; - for (int i = 0; i < info.shaderInputLayout.bufferCount; i++) { - [[buffers objectAtIndexedSubscript:info.shaderInputLayout.bufferAttributes[i].binding] setStride:info.shaderInputLayout.bufferAttributes[i].size]; - for (int j = 0; j < info.shaderInputLayout.bufferAttributes[i].attributeCount; j++) { - attributes[k].bufferIndex = i; - attributes[k].offset = info.shaderInputLayout.bufferAttributes[i].attributes[j].offset; - attributes[k].format = mtlGryphnVertexFormat(info.shaderInputLayout.bufferAttributes[i].attributes[j].format); - k++; - } - } + // layout(location = 0) in vec3 inPosition; + // layout(location = 1) in vec2 inUV; + // layout(location = 2) in vec3 inColor; + + + [attributes[0] setFormat:MTLVertexFormatFloat3]; + [attributes[0] setOffset:0]; + [attributes[0] setBufferIndex:0]; + [attributes[1] setFormat:MTLVertexFormatFloat2]; + [attributes[1] setOffset:(sizeof(float) * 3)]; + [attributes[1] setBufferIndex:0]; + [attributes[2] setFormat:MTLVertexFormatFloat3]; + [attributes[2] setOffset:(sizeof(float) * 5)]; + [attributes[2] setBufferIndex:0]; + [buffers[0] setStride:(sizeof(float) * 8)]; + + // int k = 0; + // for (int i = 0; i < info.shaderInputLayout.bufferCount; i++) { + // [[buffers objectAtIndexedSubscript:info.shaderInputLayout.bufferAttributes[i].binding] setStride:info.shaderInputLayout.bufferAttributes[i].size]; + // for (int j = 0; j < info.shaderInputLayout.bufferAttributes[i].attributeCount; j++) { + // attributes[k].bufferIndex = i; + // attributes[k].offset = info.shaderInputLayout.bufferAttributes[i].attributes[j].offset; + // attributes[k].format = mtlGryphnVertexFormat(info.shaderInputLayout.bufferAttributes[i].attributes[j].format); + // k++; + // } + // } [descriptor setVertexDescriptor:vertexDescriptor]; NSError* error = nil; diff --git a/projects/apis/metal/src/shader_module/metal_shader_module.m b/projects/apis/metal/src/shader_module/metal_shader_module.m index 4ce2ca3..6eda7c2 100644 --- a/projects/apis/metal/src/shader_module/metal_shader_module.m +++ b/projects/apis/metal/src/shader_module/metal_shader_module.m @@ -60,6 +60,8 @@ gnReturnCode createMetalShaderModule(gnShaderModule module, gnDevice device, gnS if (res != SPVC_SUCCESS) return GN_FAILED_TO_CONVERT_SHADER_CODE; + printf("Shader Module code: %s\n", result); + NSError* error = nil; MTLCompileOptions* mtloptions = nil; NSString* sourceCode = [NSString stringWithCString:result encoding:NSUTF8StringEncoding]; diff --git a/projects/apis/metal/src/surface/metal_surface.m b/projects/apis/metal/src/surface/metal_surface.m index b286e46..ab890f5 100644 --- a/projects/apis/metal/src/surface/metal_surface.m +++ b/projects/apis/metal/src/surface/metal_surface.m @@ -26,7 +26,8 @@ gnSurfaceDetails getMetalSurfaceDetails( surfaceDetails.formats = (gnSurfaceFormat[]){ { GN_FORMAT_BGRA8_SRGB, GN_COLOR_SPACE_SRGB_NONLINEAR } }; surfaceDetails.minImageCount = 2; surfaceDetails.maxImageCount = 3; - CGSize size = windowSurface->windowSurface->layer.visibleRect.size; + CGSize size = windowSurface->windowSurface->layer.drawableSize; + printf("Size: %f %f\n", size.width, size.height); surfaceDetails.minImageSize = surfaceDetails.maxImageSize = surfaceDetails.currentSize = (gnUInt2){size.width, size.height}; return surfaceDetails; } @@ -35,7 +36,7 @@ MTLPixelFormat mtlGryphnFormatToMetalFormat(gnImageFormat format) { switch (format) { case GN_FORMAT_NONE: return MTLPixelFormatInvalid; case GN_FORMAT_BGRA8_SRGB: return MTLPixelFormatBGRA8Unorm_sRGB; - case GN_FORMAT_RGBA8_SRGB: return MTLPixelFormatRG8Unorm_sRGB; + case GN_FORMAT_RGBA8_SRGB: return MTLPixelFormatRGBA8Unorm_sRGB; case GN_FORMAT_D24S8_UINT: return MTLPixelFormatDepth24Unorm_Stencil8; case GN_FORMAT_D32S8_UINT: return MTLPixelFormatDepth32Float_Stencil8; } diff --git a/projects/apis/metal/src/uniforms/metal_uniform.m b/projects/apis/metal/src/uniforms/metal_uniform.m index 8a28e83..14b5aaa 100644 --- a/projects/apis/metal/src/uniforms/metal_uniform.m +++ b/projects/apis/metal/src/uniforms/metal_uniform.m @@ -11,7 +11,6 @@ void updateMetalBufferUniform(gnUniform uniform, gnBufferUniformInfo* info) { } } - void updateMetalImageUniform(gnUniform uniform, gnImageUniformInfo* info) { for (int i = 0; i < uniform->uniform->bindingCount; i++) { if (uniform->uniform->bindings[i].binding == info->binding) { diff --git a/projects/apis/metal/src/uniforms/metal_uniform_pool.m b/projects/apis/metal/src/uniforms/metal_uniform_pool.m index a49e8e0..2f51c69 100644 --- a/projects/apis/metal/src/uniforms/metal_uniform_pool.m +++ b/projects/apis/metal/src/uniforms/metal_uniform_pool.m @@ -11,6 +11,7 @@ gnUniform* allocateMetalUniforms(gnUniformPool pool, const gnUniformAllocationIn for (int i = 0; i < allocInfo.setCount; i++) { uniforms[i] = malloc(sizeof(struct gnUniform_t)); uniforms[i]->uniform = malloc(sizeof(gnPlatformUniform)); + uniforms[i]->uniform->bindingCount = allocInfo.sets[i].uniformBindingCount; uniforms[i]->uniform->bindings = malloc(sizeof(metalUniformBinding) * allocInfo.sets[i].uniformBindingCount); for (int c = 0; c < allocInfo.sets[i].uniformBindingCount; c++) { uniforms[i]->uniform->bindings[c].type = allocInfo.sets[i].uniformBindings[c].type; diff --git a/projects/platform/platform_macos/gryphn_platform_macos.m b/projects/platform/platform_macos/gryphn_platform_macos.m index 4ca3b2d..bd075df 100644 --- a/projects/platform/platform_macos/gryphn_platform_macos.m +++ b/projects/platform/platform_macos/gryphn_platform_macos.m @@ -23,6 +23,10 @@ CAMetalLayer* gnCreateCAMetalLayer(NSWindow* window) { [layer setFramebufferOnly:YES]; [view setLayer:layer]; [view setWantsLayer:YES]; + CGSize viewSize = view.bounds.size; + CGFloat scale = view.window.screen.backingScaleFactor; + layer.drawableSize = CGSizeMake(viewSize.width * scale, + viewSize.height * scale); return layer; }