|
|
|
@@ -49,6 +49,7 @@ typedef struct { |
|
|
|
SDL_Texture* texture; |
|
|
|
int win_w; |
|
|
|
int win_h; |
|
|
|
SDL_Rect view; |
|
|
|
} sdl_render_data; |
|
|
|
|
|
|
|
static sdl_render_data the_render_data = {0}; |
|
|
|
@@ -63,6 +64,8 @@ static int sdl_render_init(nes_Renderer* rend) { |
|
|
|
fprintf(stderr, "SDL: Failed to initialize\n"); |
|
|
|
|
|
|
|
} else { |
|
|
|
SDL_ShowCursor(0); |
|
|
|
|
|
|
|
SDL_DisplayMode mode = {0}; |
|
|
|
|
|
|
|
SDL_GetCurrentDisplayMode(0, &mode); |
|
|
|
@@ -84,11 +87,37 @@ static int sdl_render_init(nes_Renderer* rend) { |
|
|
|
fprintf(stderr, "SDL: Failed to create window\n"); |
|
|
|
SDL_Quit(); |
|
|
|
status = -1; |
|
|
|
} else { |
|
|
|
// TODO: Hide behind flag |
|
|
|
SDL_SetWindowFullscreen(data->window, |
|
|
|
SDL_WINDOW_FULLSCREEN); |
|
|
|
SDL_GetWindowSize(data->window, |
|
|
|
&data->win_w, &data->win_h); |
|
|
|
|
|
|
|
// Determine the viewport within the screen |
|
|
|
|
|
|
|
int w = data->win_w; |
|
|
|
int h = data->win_h; |
|
|
|
|
|
|
|
if ((w * nes_ppu_scan_h) > (h * nes_ppu_scan_w)) { |
|
|
|
w = (h * nes_ppu_scan_w) / nes_ppu_scan_h; |
|
|
|
} else { |
|
|
|
h = (w * nes_ppu_scan_h) / nes_ppu_scan_w; |
|
|
|
} |
|
|
|
|
|
|
|
data->view.x = (data->win_w - w) / 2; |
|
|
|
data->view.y = (data->win_h - h) / 2; |
|
|
|
data->view.w = w; |
|
|
|
data->view.h = h; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (0 == status) { |
|
|
|
data->renderer = SDL_CreateRenderer(data->window, -1, 0); |
|
|
|
data->renderer = SDL_CreateRenderer( |
|
|
|
data->window, -1, |
|
|
|
SDL_RENDERER_ACCELERATED | |
|
|
|
SDL_RENDERER_PRESENTVSYNC |
|
|
|
); |
|
|
|
if (NULL == data->renderer) { |
|
|
|
fprintf(stderr, "SDL: Failed to create renderer\n"); |
|
|
|
SDL_DestroyWindow(data->window); |
|
|
|
@@ -545,14 +574,16 @@ static int sdl_render(nes_Renderer* rend, nes_ppu* ppu) { |
|
|
|
REND_LOG("Scanline %3d -> Postrender\n", ppu->scanline); |
|
|
|
|
|
|
|
SDL_UnlockTexture(data->texture); |
|
|
|
SDL_RenderCopy(data->renderer, data->texture, NULL, NULL); |
|
|
|
SDL_RenderCopy(data->renderer, data->texture, |
|
|
|
NULL, &data->view); |
|
|
|
SDL_LockTextureToSurface(data->texture, NULL, |
|
|
|
&data->target); |
|
|
|
|
|
|
|
sdl_overlay_frame( |
|
|
|
&rend->overlay, &data->font, data->renderer, |
|
|
|
data->win_w / nes_ppu_render_w, |
|
|
|
data->win_h / nes_ppu_render_h |
|
|
|
data->view.x, data->view.y, |
|
|
|
data->view.w / nes_ppu_render_w, |
|
|
|
data->view.h / nes_ppu_render_h |
|
|
|
); |
|
|
|
|
|
|
|
SDL_RenderPresent(data->renderer); |
|
|
|
@@ -567,15 +598,18 @@ static int sdl_render(nes_Renderer* rend, nes_ppu* ppu) { |
|
|
|
static void sdl_redraw_frame(nes_Renderer* rend, int dim) { |
|
|
|
sdl_render_data* data = (sdl_render_data*)rend->data; |
|
|
|
|
|
|
|
|
|
|
|
if (dim) { |
|
|
|
SDL_SetTextureAlphaMod(data->texture, 0x7F); |
|
|
|
SDL_SetTextureBlendMode(data->texture, |
|
|
|
SDL_BLENDMODE_BLEND); |
|
|
|
SDL_RenderClear(data->renderer); |
|
|
|
} |
|
|
|
|
|
|
|
SDL_RenderClear(data->renderer); |
|
|
|
|
|
|
|
SDL_UnlockTexture(data->texture); |
|
|
|
SDL_RenderCopy(data->renderer, data->texture, NULL, NULL); |
|
|
|
SDL_RenderCopy(data->renderer, data->texture, |
|
|
|
NULL, &data->view); |
|
|
|
SDL_LockTextureToSurface(data->texture, NULL, &data->target); |
|
|
|
|
|
|
|
if (dim) { |
|
|
|
@@ -593,9 +627,10 @@ static void sdl_draw_text(nes_Renderer* rend, |
|
|
|
const char* str, int x, int y, |
|
|
|
uint32_t color) { |
|
|
|
sdl_render_data* data = (sdl_render_data*)rend->data; |
|
|
|
render_string(data->renderer, x, y, |
|
|
|
data->win_w / nes_ppu_render_w, |
|
|
|
data->win_h / nes_ppu_render_h, |
|
|
|
render_string(data->renderer, |
|
|
|
x, y, data->view.x, data->view.y, |
|
|
|
data->view.w / nes_ppu_render_w, |
|
|
|
data->view.h / nes_ppu_render_h, |
|
|
|
&data->font, str, color); |
|
|
|
} |
|
|
|
|
|
|
|
|