Metal fixes

This commit is contained in:
luboslenco
2025-07-16 23:03:44 +02:00
parent d42873fba4
commit f2c4a11630
3 changed files with 33 additions and 22 deletions
+25 -13
View File
@@ -7,8 +7,6 @@
#import <Metal/Metal.h>
#import <MetalKit/MTKView.h>
#define GPU_FRAMEBUFFER_COUNT 1
id getMetalLayer(void);
id getMetalDevice(void);
id getMetalQueue(void);
@@ -28,6 +26,10 @@ static MTLViewport current_viewport;
static MTLScissorRect current_scissor;
static MTLRenderPassDescriptor *render_pass_desc;
static bool resized = false;
static gpu_texture_t *current_textures[16] = {
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
};
static MTLBlendFactor convert_blending_factor(gpu_blending_factor_t factor) {
switch (factor) {
@@ -169,7 +171,7 @@ void gpu_init_internal(int depth_buffer_bits, bool vsync) {
NSArray *arguments = [NSArray arrayWithObjects:constantsDesc, samplerDesc, textureDesc[0], textureDesc[1], textureDesc[2], textureDesc[3], textureDesc[4], textureDesc[5], textureDesc[6], textureDesc[7], textureDesc[8], textureDesc[9], textureDesc[10], textureDesc[11], textureDesc[12], textureDesc[13], textureDesc[14], textureDesc[15], nil];
argument_encoder = [device newArgumentEncoderWithArguments:arguments];
argument_buffer_step = [argument_encoder encodedLength];
argument_buffer = [device newBufferWithLength:(argument_buffer_step * 2048) options:MTLResourceStorageModeShared];
argument_buffer = [device newBufferWithLength:(argument_buffer_step * GPU_CONSTANT_BUFFER_MULTIPLE) options:MTLResourceStorageModeShared];
gpu_create_framebuffers(depth_buffer_bits);
next_drawable();
@@ -227,6 +229,10 @@ void gpu_wait() {
}
void gpu_execute_and_wait() {
if (gpu_in_use) {
[command_encoder endEncoding];
}
[command_buffer commit];
gpu_wait();
id<MTLCommandQueue> queue = getMetalQueue();
@@ -321,6 +327,9 @@ void gpu_set_pipeline(gpu_pipeline_t *pipeline) {
[command_encoder setDepthStencilState:depth_state];
[command_encoder setFrontFacingWinding:MTLWindingClockwise];
[command_encoder setCullMode:convert_cull_mode(pipeline->cull_mode)];
for (int i = 0; i < 16; ++i) {
current_textures[i] = NULL;
}
}
void gpu_set_vertex_buffer(gpu_buffer_t *buffer) {
@@ -378,21 +387,24 @@ void gpu_get_render_target_pixels(gpu_texture_t *render_target, uint8_t *data) {
void gpu_set_constant_buffer(gpu_buffer_t *buffer, int offset, size_t size) {
id<MTLBuffer> buf = (__bridge id<MTLBuffer>)buffer->impl.metal_buffer;
int i = constant_buffer_index;
[argument_encoder setArgumentBuffer:argument_buffer offset:argument_buffer_step * i];
[argument_encoder setArgumentBuffer:argument_buffer offset:argument_buffer_step * constant_buffer_index];
[argument_encoder setBuffer:buf offset:offset atIndex:0];
[argument_encoder setSamplerState:linear_sampler atIndex:1];
[command_encoder setVertexBuffer:argument_buffer offset:argument_buffer_step * i atIndex:1];
[command_encoder setFragmentBuffer:argument_buffer offset:argument_buffer_step * i atIndex:1];
[command_encoder useResource:buf usage:MTLResourceUsageRead stages:MTLRenderStageVertex|MTLRenderStageFragment];
[command_encoder setVertexBuffer:argument_buffer offset:argument_buffer_step * constant_buffer_index atIndex:1];
[command_encoder setFragmentBuffer:argument_buffer offset:argument_buffer_step * constant_buffer_index atIndex:1];
[command_encoder useResource:buf usage:MTLResourceUsageRead stages:MTLRenderStageVertex|MTLRenderStageFragment];
for (int i = 0; i < 16; ++i) {
if (current_textures[i] == NULL) {
break;
}
id<MTLTexture> tex = (__bridge id<MTLTexture>)current_textures[i]->impl._tex;
[argument_encoder setTexture:tex atIndex:i + 2];
[command_encoder useResource:tex usage:MTLResourceUsageRead stages:MTLRenderStageVertex|MTLRenderStageFragment];
}
}
void gpu_set_texture(int unit, gpu_texture_t *texture) {
id<MTLTexture> tex = (__bridge id<MTLTexture>)texture->impl._tex;
int i = constant_buffer_index;
[argument_encoder setArgumentBuffer:argument_buffer offset:argument_buffer_step * i];
[argument_encoder setTexture:tex atIndex:unit + 2];
[command_encoder useResource:tex usage:MTLResourceUsageRead stages:MTLRenderStageVertex|MTLRenderStageFragment];
current_textures[unit] = texture;
}
void gpu_pipeline_destroy(gpu_pipeline_t *pipeline) {
+6 -9
View File
@@ -1,9 +1,6 @@
#include "iron_gpu.h"
#include <iron_system.h>
#define CONSTANT_BUFFER_SIZE 256
#define CONSTANT_BUFFER_MULTIPLE 2048
static gpu_buffer_t constant_buffer;
static bool gpu_thrown = false;
@@ -20,8 +17,8 @@ int framebuffer_index = 0;
void gpu_init(int depth_buffer_bits, bool vsync) {
gpu_init_internal(depth_buffer_bits, vsync);
gpu_constant_buffer_init(&constant_buffer, CONSTANT_BUFFER_SIZE * CONSTANT_BUFFER_MULTIPLE);
gpu_constant_buffer_lock(&constant_buffer, 0, CONSTANT_BUFFER_SIZE);
gpu_constant_buffer_init(&constant_buffer, GPU_CONSTANT_BUFFER_SIZE * GPU_CONSTANT_BUFFER_MULTIPLE);
gpu_constant_buffer_lock(&constant_buffer, 0, GPU_CONSTANT_BUFFER_SIZE);
}
void gpu_begin(gpu_texture_t **targets, int count, gpu_texture_t *depth_buffer, unsigned flags, unsigned color, float depth) {
@@ -64,21 +61,21 @@ void gpu_begin(gpu_texture_t **targets, int count, gpu_texture_t *depth_buffer,
void gpu_draw() {
gpu_constant_buffer_unlock(&constant_buffer);
gpu_set_constant_buffer(&constant_buffer, constant_buffer_index * CONSTANT_BUFFER_SIZE, CONSTANT_BUFFER_SIZE);
gpu_set_constant_buffer(&constant_buffer, constant_buffer_index * GPU_CONSTANT_BUFFER_SIZE, GPU_CONSTANT_BUFFER_SIZE);
gpu_draw_internal();
constant_buffer_index++;
if (constant_buffer_index >= CONSTANT_BUFFER_MULTIPLE) {
if (constant_buffer_index >= GPU_CONSTANT_BUFFER_MULTIPLE) {
constant_buffer_index = 0;
}
draw_calls++;
if (draw_calls + draw_calls_last >= CONSTANT_BUFFER_MULTIPLE) {
if (draw_calls + draw_calls_last >= GPU_CONSTANT_BUFFER_MULTIPLE) {
draw_calls = draw_calls_last = constant_buffer_index = 0;
gpu_execute_and_wait();
}
gpu_constant_buffer_lock(&constant_buffer, constant_buffer_index * CONSTANT_BUFFER_SIZE, CONSTANT_BUFFER_SIZE);
gpu_constant_buffer_lock(&constant_buffer, constant_buffer_index * GPU_CONSTANT_BUFFER_SIZE, GPU_CONSTANT_BUFFER_SIZE);
}
void gpu_end() {
+2
View File
@@ -14,6 +14,8 @@
#define GPU_CLEAR_DEPTH 2
#define GPU_MAX_VERTEX_ELEMENTS 16
#define GPU_FRAMEBUFFER_COUNT 2
#define GPU_CONSTANT_BUFFER_SIZE 256
#define GPU_CONSTANT_BUFFER_MULTIPLE 2048
typedef enum gpu_texture_state {
GPU_TEXTURE_STATE_SHADER_RESOURCE,