ref: 9c19cb06926127b63b0f0cd444b3d57075e84839
parent: f045f88884bbcce444bb87bdab6b8c67dbc088ec
author: Lycoder <aurealinbox@gmail.com>
date: Fri Jun 16 07:54:37 EDT 2023
Improve display API
--- a/frontend/main.c
+++ b/frontend/main.c
@@ -24,7 +24,7 @@
}
int main(int argc, const char* argv[]) {- log_set_level(LOG_FATAL);
+ log_set_level(LOG_WARN);
signal(SIGINT, sigint_handler);
--- a/frontend/screen.c
+++ b/frontend/screen.c
@@ -6,7 +6,7 @@
return (psxe_screen_t*)malloc(sizeof(psxe_screen_t));
}
-void psxe_screen_init(psxe_screen_t* screen, psx_gpu_t* gpu) {+void psxe_screen_init(psxe_screen_t* screen, psx_t* psx) {memset(screen, 0, sizeof(psxe_screen_t));
#ifdef PSXE_SCREEN_DEBUG
@@ -17,11 +17,8 @@
screen->height = 240;
#endif
screen->scale = 1;
- screen->format = SDL_PIXELFORMAT_BGR555;
- screen->mode = 60;
- screen->buf = gpu->vram;
screen->open = 1;
- screen->gpu = gpu;
+ screen->psx = psx;
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS);
}
@@ -47,7 +44,7 @@
screen->texture = SDL_CreateTexture(
screen->renderer,
- screen->format,
+ SDL_PIXELFORMAT_BGR555,
SDL_TEXTUREACCESS_STREAMING,
PSX_GPU_FB_WIDTH, PSX_GPU_FB_HEIGHT
);
@@ -60,9 +57,9 @@
}
void psxe_screen_update(psxe_screen_t* screen) {- uint32_t disp_offset = screen->gpu->disp_x + (screen->gpu->disp_y * 1024);
+ void* display_buf = psx_get_display_buffer(screen->psx);
- SDL_UpdateTexture(screen->texture, NULL, screen->buf + disp_offset, PSX_GPU_FB_WIDTH * sizeof(uint16_t));
+ SDL_UpdateTexture(screen->texture, NULL, display_buf, PSX_GPU_FB_STRIDE);
SDL_RenderCopy(screen->renderer, screen->texture, NULL, NULL);
SDL_RenderPresent(screen->renderer);
@@ -102,17 +99,10 @@
screen->width = PSX_GPU_FB_WIDTH; // dmode_hres_table[gpu->display_mode & 0x3];
screen->height = PSX_GPU_FB_HEIGHT; // (gpu->display_mode & 0x4) ? 480 : 240;
#else
- static int dmode_hres_table[] = {- 256, 320, 512, 640
- };
-
- screen->width = dmode_hres_table[gpu->display_mode & 0x3];
- screen->height = (gpu->display_mode & 0x4) ? 480 : 240;
+ screen->width = psx_get_display_width(screen->psx);
+ screen->height = psx_get_display_height(screen->psx);
#endif
- screen->format = gpu->display_mode & 0x10 ? SDL_PIXELFORMAT_BGR888 : SDL_PIXELFORMAT_BGR555;
- screen->mode = gpu->display_mode & 0x8 ? 60 : 50;
-
if (screen->width >= 512) {screen->saved_scale = screen->scale;
screen->scale = 1;
@@ -124,7 +114,7 @@
screen->texture = SDL_CreateTexture(
screen->renderer,
- screen->format,
+ SDL_PIXELFORMAT_BGR555,
SDL_TEXTUREACCESS_STREAMING,
screen->width, screen->height
);
--- a/frontend/screen.h
+++ b/frontend/screen.h
@@ -1,7 +1,7 @@
#ifndef SCREEN_H
#define SCREEN_H
-#include "psx/dev/gpu.h"
+#include "psx/psx.h"
#include <string.h>
@@ -12,19 +12,16 @@
SDL_Renderer* renderer;
SDL_Texture* texture;
- psx_gpu_t* gpu;
+ psx_t* psx;
unsigned int saved_scale;
unsigned int width, height, scale;
- unsigned int format;
- unsigned int mode;
- int open;
- uint16_t* buf;
+ int open;
} psxe_screen_t;
psxe_screen_t* psxe_screen_create();
-void psxe_screen_init(psxe_screen_t*, psx_gpu_t*);
+void psxe_screen_init(psxe_screen_t*, psx_t*);
void psxe_screen_reload(psxe_screen_t*);
int psxe_screen_is_open(psxe_screen_t*);
void psxe_screen_update(psxe_screen_t*);
--- a/psx/dev/gpu.c
+++ b/psx/dev/gpu.c
@@ -721,6 +721,10 @@
}
}
+void* psx_gpu_get_display_buffer(psx_gpu_t* gpu) {+ return gpu->vram + (gpu->disp_x + (gpu->disp_y * 1024));
+}
+
void psx_gpu_destroy(psx_gpu_t* gpu) {free(gpu->vram);
free(gpu);
--- a/psx/dev/gpu.h
+++ b/psx/dev/gpu.h
@@ -14,6 +14,9 @@
#define PSX_GPU_FB_WIDTH 1024
#define PSX_GPU_FB_HEIGHT 512
+// Use this when updating your texture
+#define PSX_GPU_FB_STRIDE 2048
+
#define PSX_GPU_VRAM_SIZE (0x100000)
#define PSX_GPU_CLOCK_NTSC 53693175 // 53.693175 MHz
@@ -115,6 +118,7 @@
void psx_gpu_destroy(psx_gpu_t*);
void psx_gpu_set_udata(psx_gpu_t*, int, void*);
void psx_gpu_set_event_callback(psx_gpu_t*, int, psx_gpu_event_callback_t);
+void* psx_gpu_get_display_buffer(psx_gpu_t*);
void psx_gpu_update(psx_gpu_t*, int);
#endif
\ No newline at end of file
--- a/psx/dev/timer.c
+++ b/psx/dev/timer.c
@@ -17,35 +17,33 @@
}
uint32_t psx_timer_read32(psx_timer_t* timer, uint32_t offset) {- if (offset == 0x20) return 0x000016b0;
+ log_fatal("Unhandled 32-bit TIMER read at offset %08x", offset);- log_warn("Unhandled 32-bit TIMER read at offset %08x", offset);-
return 0x0;
}
uint16_t psx_timer_read16(psx_timer_t* timer, uint32_t offset) {- log_warn("Unhandled 16-bit TIMER read at offset %08x", offset);+ log_fatal("Unhandled 16-bit TIMER read at offset %08x", offset);return 0x0;
}
uint8_t psx_timer_read8(psx_timer_t* timer, uint32_t offset) {- log_warn("Unhandled 8-bit TIMER read at offset %08x", offset);+ log_fatal("Unhandled 8-bit TIMER read at offset %08x", offset);return 0x0;
}
void psx_timer_write32(psx_timer_t* timer, uint32_t offset, uint32_t value) {- log_warn("Unhandled 32-bit TIMER write at offset %08x (%08x)", offset, value);+ log_fatal("Unhandled 32-bit TIMER write at offset %08x (%08x)", offset, value);}
void psx_timer_write16(psx_timer_t* timer, uint32_t offset, uint16_t value) {- log_warn("Unhandled 16-bit TIMER write at offset %08x (%04x)", offset, value);+ log_fatal("Unhandled 16-bit TIMER write at offset %08x (%04x)", offset, value);}
void psx_timer_write8(psx_timer_t* timer, uint32_t offset, uint8_t value) {- log_warn("Unhandled 8-bit TIMER write at offset %08x (%02x)", offset, value);+ log_fatal("Unhandled 8-bit TIMER write at offset %08x (%02x)", offset, value);}
void psx_timer_destroy(psx_timer_t* timer) {--- a/psx/psx.c
+++ b/psx/psx.c
@@ -41,6 +41,22 @@
}
}
+void* psx_get_display_buffer(psx_t* psx) {+ psx_gpu_get_display_buffer(psx->gpu);
+}
+
+uint32_t psx_get_display_width(psx_t* psx) {+ static int dmode_hres_table[] = {+ 256, 320, 512, 640
+ };
+
+ return dmode_hres_table[psx->gpu->display_mode & 0x3];
+}
+
+uint32_t psx_get_display_height(psx_t* psx) {+ return (psx->gpu->display_mode & 0x4) ? 480 : 240;
+}
+
void psx_init(psx_t* psx, const char* bios_path) {memset(psx, 0, sizeof(psx_t));
--- a/psx/psx.h
+++ b/psx/psx.h
@@ -36,6 +36,9 @@
void psx_load_exe(psx_t*, const char*);
void psx_update(psx_t*);
void psx_run_frame(psx_t*);
+void* psx_get_display_buffer(psx_t*);
+uint32_t psx_get_display_width(psx_t*);
+uint32_t psx_get_display_height(psx_t*);
uint32_t* psx_take_screenshot(psx_t*);
psx_bios_t* psx_get_bios(psx_t*);
psx_ram_t* psx_get_ram(psx_t*);
--
⑨