[canvas, mtl] clear resets command count and stores clear color. Ccanvas' backend begin proc now takes a clearColor parameter and clears final surface to that color before drawing any batch
This commit is contained in:
parent
98bac9744f
commit
5ce53001e2
|
@ -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; i<primitiveCount; i++)
|
||||
{
|
||||
|
@ -2913,17 +2910,8 @@ void mg_flush_commands(int primitiveCount, mg_primitive* primitives, mg_path_elt
|
|||
|
||||
switch(primitive->cmd)
|
||||
{
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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<MTLRenderCommandEncoder> 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<MTLComputeCommandEncoder> 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;
|
||||
|
|
|
@ -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<float, access::write> outTexture [[texture(0)]],
|
||||
texture2d<float> texAtlas [[texture(1)]],
|
||||
|
|
Loading…
Reference in New Issue