render: add R61524 backend to render-fx for build-fxg3a target

This commit is contained in:
Lephe 2024-03-23 12:09:53 +01:00
parent 28bea2e1ce
commit 5548bf68ab
No known key found for this signature in database
GPG key ID: 1BBA026E13FC0495
7 changed files with 60 additions and 12 deletions

View file

@ -94,6 +94,10 @@ typedef image_t bopti_image_t;
@main Main VRAM area, used alone if [secondary] is NULL @main Main VRAM area, used alone if [secondary] is NULL
@secondary Additional VRAM area, enables triple buffering if non-NULL */ @secondary Additional VRAM area, enables triple buffering if non-NULL */
// TODO: In gint 3 the triple buffering mechanism will be removed. Applications
// that want to change VRAMs in-between every frame will be able to do so by
// talking directly to the video interface to set VRAM, and wrapping dupdate.
// Basically it will just no longer be handled by gint itself.
void dsetvram(uint16_t *main, uint16_t *secondary); void dsetvram(uint16_t *main, uint16_t *secondary);
/* dgetvram() - Get VRAM addresses /* dgetvram() - Get VRAM addresses

View file

@ -49,6 +49,12 @@ void r61524_display(uint16_t *vram, int start, int height, int method);
void r61524_display_rect(uint16_t *vram, int xmin, int xmax, int ymin, void r61524_display_rect(uint16_t *vram, int xmin, int xmax, int ymin,
int ymax); int ymax);
/* r61524_display_mono_128x64(): Display a mono-style VRAM
This experimental function updates the display with the contents of a 128x64
VRAM, used with the fxg3a compilation target.
TODO: Make that a video mode. */
void r61524_display_mono_128x64(uint32_t *vram);
/* r61524_start_frame(): Prepare the display for a region update /* r61524_start_frame(): Prepare the display for a region update
This function sets up the display driver to receive graphics data to update This function sets up the display driver to receive graphics data to update

View file

@ -114,12 +114,9 @@ void kinit(void)
gint_world_addin = gint_world_alloc(); gint_world_addin = gint_world_alloc();
gint_driver_flags = malloc(gint_driver_count()); gint_driver_flags = malloc(gint_driver_count());
#ifdef FXCG50
/* Allocate VRAMs, which is important for panic screens */
extern bool dvram_init(void); extern bool dvram_init(void);
if(!dvram_init()) if(!dvram_init())
abort(); abort();
#endif
if(!gint_world_os || !gint_world_addin || !gint_driver_flags) if(!gint_world_os || !gint_world_addin || !gint_driver_flags)
gint_panic(0x1060); gint_panic(0x1060);

View file

@ -220,11 +220,11 @@ void gint_copy_vram(void)
{ {
void *__GetVRAMAddress(void); void *__GetVRAMAddress(void);
#ifdef FX9860G #if GINT_OS_FX
memcpy(__GetVRAMAddress(), gint_vram, 1024); memcpy(__GetVRAMAddress(), gint_vram, 1024);
#endif #endif
#ifdef FXCG50 #if GINT_OS_CG && GINT_RENDER_RGB
/* TODO: Improve copied VRAM behavior in gint_osmenu() on fxcg50 */ /* TODO: Improve copied VRAM behavior in gint_osmenu() on fxcg50 */
uint16_t *vram1, *vram2; uint16_t *vram1, *vram2;
dgetvram(&vram1, &vram2); dgetvram(&vram1, &vram2);
@ -238,6 +238,10 @@ void gint_copy_vram(void)
dst[x] = src[x]; dst[x] = src[x];
} }
#endif #endif
#if GINT_OS_CG && GINT_RENDER_MONO
// TODO: VRAM save mechanism for mono video mode on R61524
#endif
} }
void gint_poweroff(bool show_logo) void gint_poweroff(bool show_logo)

View file

@ -11,7 +11,7 @@
#include <gint/drivers/r61524.h> #include <gint/drivers/r61524.h>
#include <gint/config.h> #include <gint/config.h>
#if GINT_RENDER_RGB #if GINT_HW_CG
#define DMA SH7305_DMA #define DMA SH7305_DMA
#define POWER SH7305_POWER #define POWER SH7305_POWER
@ -199,6 +199,26 @@ void r61524_display_rect(uint16_t *vram, int xmin, int xmax, int ymin,
} }
} }
void r61524_display_mono_128x64(uint32_t *vram)
{
dma_transfer_wait(0);
r61524_start_frame(0, 383, 0, 191);
for(int y = 0; y < 64; y++) {
for(int sy = 0; sy < 3; sy++) {
/* Get pixels manually, ooh, slow */
for(int x = 0; x < 128; x++) {
int pixel = vram[x >> 5] >> (~x & 31);
int color = (pixel & 1) ? 0x0000 : 0xffff;
write(color);
write(color);
write(color);
}
}
vram += 4;
}
}
//--- //---
// State and driver metadata // State and driver metadata
//--- //---
@ -221,4 +241,4 @@ gint_driver_t drv_r61524 = {
}; };
GINT_DECLARE_DRIVER(26, drv_r61524); GINT_DECLARE_DRIVER(26, drv_r61524);
#endif /* GINT_RENDER_RGB */ #endif /* GINT_HW_CG */

View file

@ -1,10 +1,17 @@
#include <gint/display.h> #include <gint/display.h>
#include <gint/drivers/t6k11.h>
#include "../render/render.h" #include "../render/render.h"
#include <gint/config.h> #include <gint/config.h>
#if GINT_RENDER_MONO #if GINT_RENDER_MONO
#if GINT_HW_FX
# include <gint/drivers/t6k11.h>
#elif GINT_HW_CG
# include <gint/drivers/r61524.h>
#else
# error Platform unknown for mono video mode update
#endif
/* Standard video RAM for fx9860g is 1 bit per pixel */ /* Standard video RAM for fx9860g is 1 bit per pixel */
GSECTION(".bss") GALIGNED(32) static uint32_t fx_vram[256]; GSECTION(".bss") GALIGNED(32) static uint32_t fx_vram[256];
@ -14,6 +21,12 @@ uint32_t *gint_vram = fx_vram;
/* The current rendering mode */ /* The current rendering mode */
struct rendering_mode const *dmode = NULL; struct rendering_mode const *dmode = NULL;
/* For parity with the current RGB interface */
bool dvram_init(void)
{
return true;
}
/* dupdate(): Push the video RAM to the display driver */ /* dupdate(): Push the video RAM to the display driver */
void dupdate(void) void dupdate(void)
{ {
@ -28,7 +41,11 @@ void dupdate(void)
} }
if(run_default) if(run_default)
{ {
#if GINT_HW_FX
t6k11_display(gint_vram, 0, 64, 16); t6k11_display(gint_vram, 0, 64, 16);
#elif GINT_HW_CG
r61524_display_mono_128x64(gint_vram);
#endif
} }
gint_call(dupdate_get_hook()); gint_call(dupdate_get_hook());

View file

@ -104,12 +104,12 @@ static void capture_vram(GUNUSED bool onscreen, char const *type)
void *source = gint_vram; void *source = gint_vram;
int size, format; int size, format;
#ifdef FX9860G #if GINT_RENDER_MONO
size = 1024; size = 1024;
format = USB_FXLINK_IMAGE_MONO; format = USB_FXLINK_IMAGE_MONO;
#endif #endif
#ifdef FXCG50 #if GINT_RENDER_RGB
if(onscreen) { if(onscreen) {
uint16_t *main, *secondary; uint16_t *main, *secondary;
dgetvram(&main, &secondary); dgetvram(&main, &secondary);
@ -187,11 +187,11 @@ static void execute_command(char const *cmd)
usb_fxlink_text(text, 0); usb_fxlink_text(text, 0);
} }
if(!strncmp(cmd, "identify", 8)) { if(!strncmp(cmd, "identify", 8)) {
#if defined(FX9860G) #if GINT_OS_FX
char const *serial_number = (void *)0x8000ffd0; char const *serial_number = (void *)0x8000ffd0;
char const *OS_version = (void *)0x80010020; char const *OS_version = (void *)0x80010020;
char const *BC_version = (void *)0x8000ffb0; char const *BC_version = (void *)0x8000ffb0;
#elif defined(FXCG50) #elif GINT_OS_CG
char const *serial_number = (void *)0x8001ffd0; char const *serial_number = (void *)0x8001ffd0;
char const *OS_version = (void *)0x80020020; char const *OS_version = (void *)0x80020020;
char const *BC_version = (void *)0x8001ffb0; char const *BC_version = (void *)0x8001ffb0;