diff --git a/src/graphics.c b/src/graphics.c index 5995832..ef362af 100644 --- a/src/graphics.c +++ b/src/graphics.c @@ -73,18 +73,17 @@ typedef struct mg_rounded_rect f32 r; } mg_rounded_rect; -typedef enum { MG_CMD_CLEAR = 0, - MG_CMD_FILL, - MG_CMD_STROKE, - MG_CMD_RECT_FILL, - MG_CMD_RECT_STROKE, - MG_CMD_ROUND_RECT_FILL, - MG_CMD_ROUND_RECT_STROKE, - MG_CMD_ELLIPSE_FILL, - MG_CMD_ELLIPSE_STROKE, - MG_CMD_JUMP, - MG_CMD_CLIP_PUSH, - MG_CMD_CLIP_POP, +typedef enum { MG_CMD_FILL, + MG_CMD_STROKE, + MG_CMD_RECT_FILL, + MG_CMD_RECT_STROKE, + MG_CMD_ROUND_RECT_FILL, + MG_CMD_ROUND_RECT_STROKE, + MG_CMD_ELLIPSE_FILL, + MG_CMD_ELLIPSE_STROKE, + MG_CMD_JUMP, + MG_CMD_CLIP_PUSH, + MG_CMD_CLIP_POP, } mg_primitive_cmd; typedef struct mg_primitive @@ -202,6 +201,7 @@ typedef struct mg_canvas_data mg_primitive primitives[MG_MAX_PRIMITIVE_COUNT]; //NOTE: these are used at render time + mg_color clearColor; mp_rect clip; mg_mat2x3 transform; mg_image image; @@ -2882,17 +2882,14 @@ void mg_flush_commands(int primitiveCount, mg_primitive* primitives, mg_path_elt return; } - mg_color clearColor = {0, 0, 0, 1}; - u32 nextIndex = 0; mg_reset_shape_index(canvas); canvas->clip = (mp_rect){-FLT_MAX/2, -FLT_MAX/2, FLT_MAX, FLT_MAX}; - canvas->image = mg_image_nil(); - canvas->backend->begin(canvas->backend); + canvas->backend->begin(canvas->backend, canvas->clearColor); for(int i=0; icmd) { - case MG_CMD_CLEAR: - { - //NOTE(martin): clear buffers - canvas->vertexCount = 0; - canvas->indexCount = 0; - - canvas->backend->clear(canvas->backend, primitive->attributes.color); - } break; - case MG_CMD_FILL: - { + { mg_next_shape(canvas, &primitive->attributes); mg_render_fill(canvas, pathElements + primitive->path.startIndex, @@ -3482,7 +3470,8 @@ void mg_clear() mg_canvas_data* canvas = __mgCurrentCanvas; if(canvas) { - mg_push_command(canvas, (mg_primitive){.cmd = MG_CMD_CLEAR}); + canvas->primitiveCount = 0; + canvas->clearColor = canvas->attributes.color; } } diff --git a/src/graphics_internal.h b/src/graphics_internal.h index 9dd27b5..9aa2d2f 100644 --- a/src/graphics_internal.h +++ b/src/graphics_internal.h @@ -104,9 +104,8 @@ typedef struct mg_vertex_layout typedef struct mg_canvas_backend mg_canvas_backend; typedef void (*mg_canvas_backend_destroy_proc)(mg_canvas_backend* backend); -typedef void (*mg_canvas_backend_begin_proc)(mg_canvas_backend* backend); +typedef void (*mg_canvas_backend_begin_proc)(mg_canvas_backend* backend, mg_color clearColor); typedef void (*mg_canvas_backend_end_proc)(mg_canvas_backend* backend); -typedef void (*mg_canvas_backend_clear_proc)(mg_canvas_backend* backend, mg_color clearColor); typedef void (*mg_canvas_backend_draw_batch_proc)(mg_canvas_backend* backend, mg_image_data* imageData, u32 vertexCount, @@ -128,7 +127,6 @@ typedef struct mg_canvas_backend mg_canvas_backend_destroy_proc destroy; mg_canvas_backend_begin_proc begin; mg_canvas_backend_end_proc end; - mg_canvas_backend_clear_proc clear; mg_canvas_backend_draw_batch_proc drawBatch; mg_canvas_backend_image_create_proc imageCreate; diff --git a/src/mtl_canvas.m b/src/mtl_canvas.m index 9552bf9..884af9e 100644 --- a/src/mtl_canvas.m +++ b/src/mtl_canvas.m @@ -25,7 +25,6 @@ typedef struct mg_mtl_canvas_backend mg_canvas_backend interface; mg_surface surface; - mg_color clearColor; u32 vertexBufferOffset; u32 indexBufferOffset; u32 shapeBufferOffset; @@ -94,7 +93,7 @@ void mg_mtl_canvas_update_vertex_layout(mg_mtl_canvas_backend* backend) .indexStride = sizeof(int)}; } -void mg_mtl_canvas_begin(mg_canvas_backend* interface) +void mg_mtl_canvas_begin(mg_canvas_backend* interface, mg_color clearColor) { mg_mtl_canvas_backend* backend = (mg_mtl_canvas_backend*)interface; mg_mtl_surface* surface = mg_mtl_canvas_get_surface(backend); @@ -114,12 +113,12 @@ void mg_mtl_canvas_begin(mg_canvas_backend* interface) backend->shapeBufferOffset = 0; mg_mtl_canvas_update_vertex_layout(backend); - MTLClearColor clearColor = MTLClearColorMake(backend->clearColor.r, backend->clearColor.g, backend->clearColor.b, backend->clearColor.a); + MTLClearColor mtlClearColor = MTLClearColorMake(clearColor.r, clearColor.g, clearColor.b, clearColor.a); MTLRenderPassDescriptor* renderPassDescriptor = [MTLRenderPassDescriptor renderPassDescriptor]; renderPassDescriptor.colorAttachments[0].texture = surface->drawable.texture; renderPassDescriptor.colorAttachments[0].loadAction = MTLLoadActionClear; - renderPassDescriptor.colorAttachments[0].clearColor = clearColor; + renderPassDescriptor.colorAttachments[0].clearColor = mtlClearColor; renderPassDescriptor.colorAttachments[0].storeAction = MTLStoreActionStore; id renderEncoder = [surface->commandBuffer renderCommandEncoderWithDescriptor:renderPassDescriptor]; @@ -130,13 +129,6 @@ void mg_mtl_canvas_begin(mg_canvas_backend* interface) void mg_mtl_canvas_end(mg_canvas_backend* interface) {} -void mg_mtl_canvas_clear(mg_canvas_backend* interface, mg_color clearColor) -{ - //TODO - mg_mtl_canvas_backend* backend = (mg_mtl_canvas_backend*)interface; - backend->clearColor = clearColor; -} - void mg_mtl_canvas_draw_batch(mg_canvas_backend* interface, mg_image_data* image, u32 shapeCount, u32 vertexCount, u32 indexCount) { mg_mtl_canvas_backend* backend = (mg_mtl_canvas_backend*)interface; @@ -207,9 +199,6 @@ void mg_mtl_canvas_draw_batch(mg_canvas_backend* interface, mg_image_data* image //----------------------------------------------------------- //NOTE(martin): encode drawing pass //----------------------------------------------------------- - //TODO: remove that - vector_float4 clearColorVec4 = {backend->clearColor.r, backend->clearColor.g, backend->clearColor.b, backend->clearColor.a}; - id drawEncoder = [surface->commandBuffer computeCommandEncoder]; drawEncoder.label = @"drawing pass"; [drawEncoder setComputePipelineState:backend->computePipeline]; @@ -226,9 +215,8 @@ void mg_mtl_canvas_draw_batch(mg_canvas_backend* interface, mg_image_data* image useTexture = 1; } - [drawEncoder setBytes: &clearColorVec4 length: sizeof(vector_float4) atIndex: 3]; - [drawEncoder setBytes: &useTexture length:sizeof(int) atIndex: 4]; - [drawEncoder setBytes: &scale length: sizeof(float) atIndex: 5]; + [drawEncoder setBytes: &useTexture length:sizeof(int) atIndex: 3]; + [drawEncoder setBytes: &scale length: sizeof(float) atIndex: 4]; //TODO: check that we don't exceed maxTotalThreadsPerThreadgroup DEBUG_ASSERT(RENDERER_TILE_SIZE*RENDERER_TILE_SIZE <= backend->computePipeline.maxTotalThreadsPerThreadgroup); @@ -395,7 +383,6 @@ mg_canvas_backend* mg_mtl_canvas_create(mg_surface surface) backend->interface.destroy = mg_mtl_canvas_destroy; backend->interface.begin = mg_mtl_canvas_begin; backend->interface.end = mg_mtl_canvas_end; - backend->interface.clear = mg_mtl_canvas_clear; backend->interface.drawBatch = mg_mtl_canvas_draw_batch; backend->interface.imageCreate = mg_mtl_canvas_image_create; diff --git a/src/mtl_shader.metal b/src/mtl_shader.metal index f333b0e..f2c110f 100644 --- a/src/mtl_shader.metal +++ b/src/mtl_shader.metal @@ -164,9 +164,8 @@ kernel void RenderKernel(const device uint* tileCounters [[buffer(0)]], const device uint* tileArrayBuffer [[buffer(1)]], const device mg_triangle_data* triangleArray [[buffer(2)]], - constant float4* clearColor [[buffer(3)]], - constant int* useTexture [[buffer(4)]], - constant float* scaling [[buffer(5)]], + constant int* useTexture [[buffer(3)]], + constant float* scaling [[buffer(4)]], texture2d outTexture [[texture(0)]], texture2d texAtlas [[texture(1)]],