#include #include int* g_framebuffer; SDL_Window* g_SDLWindow; SDL_Renderer* g_SDLRenderer; SDL_Texture* g_SDLTexture; static int g_Done; const int WINDOW_WIDTH = 1920 / 2; const int WINDOW_HEIGHT = 1080 / 2; bool update() { SDL_Event e; if (SDL_PollEvent(&e)) { if (e.type == SDL_EVENT_QUIT) return false; if (e.type == SDL_EVENT_KEY_UP && e.key.key == SDLK_ESCAPE) return false; } char* pix; int pitch; SDL_LockTexture(g_SDLTexture, NULL, (void**)&pix, &pitch); for (int i = 0, sp = 0, dp = 0; i < WINDOW_HEIGHT; i++, dp += WINDOW_WIDTH, sp += pitch) { memcpy(pix + sp, g_framebuffer + dp, WINDOW_WIDTH * 4); } SDL_UnlockTexture(g_SDLTexture); SDL_RenderTexture(g_SDLRenderer, g_SDLTexture, NULL, NULL); SDL_RenderPresent(g_SDLRenderer); SDL_Delay(1); return true; } void render(u64 aTicks) { for (int i = 0, c = 0; i < WINDOW_HEIGHT; i++) { for (int j = 0; j < WINDOW_WIDTH; j++, c++) { g_framebuffer[c] = (int)(i * i + j * j + aTicks) | 0xff000000; } } } void loop() { if (!update()) { g_Done = 1; } else { render(SDL_GetTicks()); } } int main() { if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS)) { return -1; } g_framebuffer = new int[WINDOW_WIDTH * WINDOW_HEIGHT]; g_SDLWindow = SDL_CreateWindow("test", WINDOW_WIDTH, WINDOW_HEIGHT, 0); g_SDLRenderer = SDL_CreateRenderer(g_SDLWindow, NULL); g_SDLTexture = SDL_CreateTexture(g_SDLRenderer, SDL_PIXELFORMAT_ABGR8888, SDL_TEXTUREACCESS_STREAMING, WINDOW_WIDTH, WINDOW_HEIGHT); if (!g_framebuffer || !g_SDLWindow || !g_SDLRenderer || ! g_SDLTexture) { return -1; } g_Done = 0; while (!g_Done) { loop(); } SDL_DestroyTexture(g_SDLTexture); SDL_DestroyRenderer(g_SDLRenderer); SDL_DestroyWindow(g_SDLWindow); SDL_Quit(); return 0; }