change rendering to use textures, massive performance improvement
This commit is contained in:
parent
e9f32da983
commit
bae31894a7
24
main.c
24
main.c
|
@ -22,6 +22,7 @@ const rgb_t BLUE = {0, 0, 255, 255};
|
|||
typedef struct {
|
||||
SDL_Renderer *renderer;
|
||||
SDL_Window *window;
|
||||
SDL_Texture *tex;
|
||||
rgb_t *canvas;
|
||||
} sdl_state_t;
|
||||
|
||||
|
@ -69,6 +70,11 @@ init_sdl(void)
|
|||
SDL_RenderClear(ret.renderer);
|
||||
SDL_RenderPresent(ret.renderer);
|
||||
|
||||
ret.tex = SDL_CreateTexture(ret.renderer,
|
||||
SDL_PIXELFORMAT_ARGB8888,
|
||||
SDL_TEXTUREACCESS_STATIC,
|
||||
W, H);
|
||||
|
||||
ret.canvas = malloc(sizeof(rgb_t) * W * H);
|
||||
clear_canvas(ret.canvas, (rgb_t){0, 0, 0, 255});
|
||||
|
||||
|
@ -80,22 +86,34 @@ free_sdl(sdl_state_t state)
|
|||
{
|
||||
SDL_DestroyRenderer(state.renderer);
|
||||
SDL_DestroyWindow(state.window);
|
||||
SDL_DestroyTexture(state.tex);
|
||||
free(state.canvas);
|
||||
SDL_Quit();
|
||||
}
|
||||
|
||||
uint32_t
|
||||
rgb_to_int(rgb_t c)
|
||||
{
|
||||
return (((uint32_t)c.a << 24)
|
||||
| ((uint32_t)c.r << 16)
|
||||
| ((uint32_t)c.g << 8)
|
||||
| ((uint32_t)c.b));
|
||||
}
|
||||
|
||||
// TODO: Highly unefficient. Makes a *lot* of SDL calls.
|
||||
void
|
||||
render(sdl_state_t state)
|
||||
{
|
||||
uint32_t pixels[H*W];
|
||||
for (size_t y = 0; y < H; y++) {
|
||||
for (size_t x = 0; x < W; x++) {
|
||||
rgb_t curr = state.canvas[x + y * W];
|
||||
SDL_SetRenderDrawColor(state.renderer, curr.r, curr.g, curr.b, curr.a);
|
||||
SDL_RenderDrawPoint(state.renderer, x, y);
|
||||
pixels[x + y * W] = rgb_to_int(state.canvas[x + y * W]);
|
||||
}
|
||||
}
|
||||
SDL_UpdateTexture(state.tex, NULL, pixels, W * sizeof(uint32_t));
|
||||
|
||||
/* present the texture */
|
||||
SDL_RenderCopy(state.renderer, state.tex, NULL, NULL);
|
||||
SDL_RenderPresent(state.renderer);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue