1 // Copyright (c) 2015 Sergio Gonzalez. All rights reserved.
2 // License: https://github.com/serge-rgb/milton#license
3 
4 
5 #pragma once
6 
7 #include "common.h"
8 
9 #define RENDER_STACK_SIZE       (1 << 20)
10 
11 // Render Workers:
12 //    We have a bunch of workers running on threads, who wait on a lockless
13 //    queue to take BlockgroupRenderBackend structures.
14 //    When there is work available, they call blockgroup_render_thread with the
15 //    appropriate parameters.
16 struct BlockgroupRenderBackend
17 {
18     i32     block_start;
19 };
20 
21 struct RenderStack
22 {
23     Rect*   blocks;  // Screen areas to render.
24     i32     num_blocks;
25     u32*    canvas_buffer;
26 
27     // LIFO work queue
28     SDL_mutex*              mutex;
29     BlockgroupRenderBackend    blockgroup_render_data[RENDER_STACK_SIZE];
30     i32                     index;
31 
32     SDL_sem*   work_available;
33     SDL_sem*   completed_semaphore;
34 };
35 
36 
37 enum MiltonRenderFlags
38 {
39     MiltonRenderFlags_NONE              = 0,
40 
41     MiltonRenderFlags_UI_UPDATED       = 1 << 0,
42     MiltonRenderFlags_FULL_REDRAW      = 1 << 1,
43     MiltonRenderFlags_FINISHED_STROKE  = 1 << 2,
44     MiltonRenderFlags_PAN_COPY         = 1 << 3,
45     MiltonRenderFlags_BRUSH_PREVIEW    = 1 << 4,
46     MiltonRenderFlags_BRUSH_HOVER      = 1 << 5,
47     MiltonRenderFlags_DRAW_ITERATIVELY = 1 << 6,
48     MiltonRenderFlags_BRUSH_CHANGE     = 1 << 7,
49 };
50