aboutsummaryrefslogtreecommitdiff
path: root/libpsn00b/psxgpu
diff options
context:
space:
mode:
authorspicyjpeg <thatspicyjpeg@gmail.com>2022-12-28 14:27:34 +0100
committerspicyjpeg <thatspicyjpeg@gmail.com>2022-12-28 14:27:34 +0100
commit50faf92a8cb099420aa956dcac3a8105067e117c (patch)
treefa817a7419bc06aee432fa9e608b173d628c3b5d /libpsn00b/psxgpu
parent7e350980d5c09bbc81a0de01bf016a87ecfc4feb (diff)
downloadpsn00bsdk-50faf92a8cb099420aa956dcac3a8105067e117c.tar.gz
Re-enable MoveImage(), add tagless primitive structs
Diffstat (limited to 'libpsn00b/psxgpu')
-rw-r--r--libpsn00b/psxgpu/common.c31
-rw-r--r--libpsn00b/psxgpu/env.c27
-rw-r--r--libpsn00b/psxgpu/image.c12
3 files changed, 40 insertions, 30 deletions
diff --git a/libpsn00b/psxgpu/common.c b/libpsn00b/psxgpu/common.c
index e66e46c..8d2119b 100644
--- a/libpsn00b/psxgpu/common.c
+++ b/libpsn00b/psxgpu/common.c
@@ -46,7 +46,8 @@ static void _vblank_handler(void) {
}
static void _gpu_dma_handler(void) {
- //while (!(GPU_GP1 & (1 << 26)) || (DMA_CHCR(DMA_GPU) & (1 << 24)))
+ if (GPU_GP1 & (1 << 24))
+ GPU_GP1 = 0x02000000;
while (!(GPU_GP1 & (1 << 26)))
__asm__ volatile("");
@@ -72,6 +73,7 @@ void ResetGraph(int mode) {
if (!ResetCallback()) {
EnterCriticalSection();
InterruptCallback(IRQ_VBLANK, &_vblank_handler);
+ InterruptCallback(IRQ_GPU, &_gpu_dma_handler);
DMACallback(DMA_GPU, &_gpu_dma_handler);
_gpu_video_mode = (GPU_GP1 >> 20) & 1;
@@ -308,30 +310,3 @@ void DrawOTag2(const uint32_t *ot) {
DMA_BCR(DMA_GPU) = 0;
DMA_CHCR(DMA_GPU) = 0x01000401;
}
-
-/* Misc. functions */
-
-GPU_VideoMode GetVideoMode(void) {
- return _gpu_video_mode;
-}
-
-void SetVideoMode(GPU_VideoMode mode) {
- uint32_t _mode, stat = GPU_GP1;
-
- _gpu_video_mode = mode & 1;
-
- _mode = (mode & 1) << 3;
- _mode |= (stat >> 17) & 0x37; // GPUSTAT 17-22 -> cmd bits 0-5
- _mode |= (stat >> 10) & 0x40; // GPUSTAT bit 16 -> cmd bit 6
- _mode |= (stat >> 7) & 0x80; // GPUSTAT bit 14 -> cmd bit 7
-
- GPU_GP1 = 0x08000000 | mode;
-}
-
-int GetODE(void) {
- return (GPU_GP1 >> 31);
-}
-
-void SetDispMask(int mask) {
- GPU_GP1 = 0x03000000 | (mask ? 0 : 1);
-}
diff --git a/libpsn00b/psxgpu/env.c b/libpsn00b/psxgpu/env.c
index 8784947..96e065e 100644
--- a/libpsn00b/psxgpu/env.c
+++ b/libpsn00b/psxgpu/env.c
@@ -233,3 +233,30 @@ void PutDispEnvRaw(const DISPENV_RAW *env) {
GPU_GP1 = 0x08000000 | env->vid_mode; // Set video mode
GPU_GP1 = 0x05000000 | fb_pos; // Set VRAM location to display
}
+
+/* Misc. display functions */
+
+GPU_VideoMode GetVideoMode(void) {
+ return _gpu_video_mode;
+}
+
+void SetVideoMode(GPU_VideoMode mode) {
+ uint32_t _mode, stat = GPU_GP1;
+
+ _gpu_video_mode = mode & 1;
+
+ _mode = (mode & 1) << 3;
+ _mode |= (stat >> 17) & 0x37; // GPUSTAT bits 17-22 -> command bits 0-5
+ _mode |= (stat >> 10) & 0x40; // GPUSTAT bit 16 -> command bit 6
+ _mode |= (stat >> 7) & 0x80; // GPUSTAT bit 14 -> command bit 7
+
+ GPU_GP1 = 0x08000000 | _mode;
+}
+
+int GetODE(void) {
+ return (GPU_GP1 >> 31);
+}
+
+void SetDispMask(int mask) {
+ GPU_GP1 = 0x03000000 | (mask ? 0 : 1);
+}
diff --git a/libpsn00b/psxgpu/image.c b/libpsn00b/psxgpu/image.c
index 96f5366..09c7ab9 100644
--- a/libpsn00b/psxgpu/image.c
+++ b/libpsn00b/psxgpu/image.c
@@ -90,6 +90,10 @@ int StoreImage(const RECT *rect, uint32_t *data) {
);
}
+int MoveImage(const RECT *rect, int x, int y) {
+ return EnqueueDrawOp((void *) &MoveImage2, (uint32_t) rect, x, y);
+}
+
void LoadImage2(const RECT *rect, const uint32_t *data) {
_dma_transfer(rect, (uint32_t *) data, 1);
}
@@ -98,14 +102,18 @@ void StoreImage2(const RECT *rect, uint32_t *data) {
_dma_transfer(rect, data, 0);
}
-/*void MoveImage2(const RECT *rect, int x, int y) {
+void MoveImage2(const RECT *rect, int x, int y) {
GPU_GP0 = 0x80000000;
//GPU_GP0 = rect->x | (rect->y << 16);
GPU_GP0 = *((const uint32_t *) &(rect->x));
GPU_GP0 = (x & 0xffff) | (y << 16);
//GPU_GP0 = rect->w | (rect->h << 16);
GPU_GP0 = *((const uint32_t *) &(rect->w));
-}*/
+
+ // As no DMA transfer is performed by this command, the GPU IRQ is used
+ // instead of the DMA IRQ to trigger the draw queue callback.
+ GPU_GP0 = 0x1f000000;
+}
/* .TIM image parsers */