More porting work

This commit is contained in:
Luke Benstead 2021-04-03 21:48:57 +01:00
parent be974e96ad
commit 6361cd415e
9 changed files with 142 additions and 88 deletions

View File

@ -1,57 +1,16 @@
#include <kos.h>
#include "../include/glkos.h" #include "../include/glkos.h"
#include "../containers/aligned_vector.h" #include "../containers/aligned_vector.h"
#include "private.h" #include "private.h"
#include "profiler.h" #include "profiler.h"
#include "version.h" #include "version.h"
#define TA_SQ_ADDR (unsigned int *)(void *) \
(0xe0000000 | (((unsigned long)0x10000000) & 0x03ffffe0))
static PolyList OP_LIST; static PolyList OP_LIST;
static PolyList PT_LIST; static PolyList PT_LIST;
static PolyList TR_LIST; static PolyList TR_LIST;
static void pvr_list_submit(void *src, int n) {
GLuint *d = TA_SQ_ADDR;
GLuint *s = src;
/* fill/write queues as many times necessary */
while(n--) {
__asm__("pref @%0" : : "r"(s + 8)); /* prefetch 32 bytes for next loop */
d[0] = *(s++);
d[1] = *(s++);
d[2] = *(s++);
d[3] = *(s++);
d[4] = *(s++);
d[5] = *(s++);
d[6] = *(s++);
d[7] = *(s++);
__asm__("pref @%0" : : "r"(d));
d += 8;
}
/* Wait for both store queues to complete */
d = (GLuint *)0xe0000000;
d[0] = d[8] = 0;
}
static void _glInitPVR(GLboolean autosort, GLboolean fsaa) {
pvr_init_params_t params = {
/* Enable opaque and translucent polygons with size 32 and 32 */
{PVR_BINSIZE_32, PVR_BINSIZE_0, PVR_BINSIZE_32, PVR_BINSIZE_0, PVR_BINSIZE_32},
PVR_VERTEX_BUF_SIZE, /* Vertex buffer size */
0, /* No DMA */
fsaa, /* No FSAA */
(autosort) ? 0 : 1 /* Disable translucent auto-sorting to match traditional GL */
};
pvr_init(&params);
}
PolyList* _glActivePolyList() { PolyList* _glActivePolyList() {
if(_glIsBlendingEnabled()) { if(_glIsBlendingEnabled()) {
@ -92,7 +51,7 @@ void APIENTRY glKosInitEx(GLdcConfig* config) {
printf("\nWelcome to GLdc! Git revision: %s\n\n", GLDC_VERSION); printf("\nWelcome to GLdc! Git revision: %s\n\n", GLDC_VERSION);
_glInitPVR(config->autosort_enabled, config->fsaa_enabled); InitGPU(config->autosort_enabled, config->fsaa_enabled);
_glInitMatrices(); _glInitMatrices();
_glInitAttributePointers(); _glInitAttributePointers();
@ -105,9 +64,9 @@ void APIENTRY glKosInitEx(GLdcConfig* config) {
_glInitTextures(); _glInitTextures();
OP_LIST.list_type = PVR_LIST_OP_POLY; OP_LIST.list_type = GPU_LIST_OP_POLY;
PT_LIST.list_type = PVR_LIST_PT_POLY; PT_LIST.list_type = GPU_LIST_PT_POLY;
TR_LIST.list_type = PVR_LIST_TR_POLY; TR_LIST.list_type = GPU_LIST_TR_POLY;
aligned_vector_init(&OP_LIST.vector, sizeof(Vertex)); aligned_vector_init(&OP_LIST.vector, sizeof(Vertex));
aligned_vector_init(&PT_LIST.vector, sizeof(Vertex)); aligned_vector_init(&PT_LIST.vector, sizeof(Vertex));
@ -124,7 +83,6 @@ void APIENTRY glKosInit() {
glKosInitEx(&config); glKosInitEx(&config);
} }
#define QACRTA ((((unsigned int)0x10000000)>>26)<<2)&0x1c
void APIENTRY glKosSwapBuffers() { void APIENTRY glKosSwapBuffers() {
static int frame_count = 0; static int frame_count = 0;
@ -133,24 +91,19 @@ void APIENTRY glKosSwapBuffers() {
profiler_push(__func__); profiler_push(__func__);
pvr_wait_ready(); SceneBegin();
SceneListBegin(GPU_LIST_OP_POLY);
SceneListSubmit(OP_LIST.vector.data, OP_LIST.vector.size);
SceneListFinish();
pvr_scene_begin(); SceneListBegin(GPU_LIST_PT_POLY);
QACR0 = QACRTA; SceneListSubmit(PT_LIST.vector.data, PT_LIST.vector.size);
QACR1 = QACRTA; SceneListFinish();
pvr_list_begin(PVR_LIST_OP_POLY); SceneListBegin(GPU_LIST_TR_POLY);
pvr_list_submit(OP_LIST.vector.data, OP_LIST.vector.size); SceneListSubmit(TR_LIST.vector.data, TR_LIST.vector.size);
pvr_list_finish(); SceneListFinish();
SceneFinish();
pvr_list_begin(PVR_LIST_PT_POLY);
pvr_list_submit(PT_LIST.vector.data, PT_LIST.vector.size);
pvr_list_finish();
pvr_list_begin(PVR_LIST_TR_POLY);
pvr_list_submit(TR_LIST.vector.data, TR_LIST.vector.size);
pvr_list_finish();
pvr_scene_finish();
aligned_vector_clear(&OP_LIST.vector); aligned_vector_clear(&OP_LIST.vector);
aligned_vector_clear(&PT_LIST.vector); aligned_vector_clear(&PT_LIST.vector);

View File

@ -3,7 +3,7 @@
#include <string.h> #include <string.h>
#include <math.h> #include <math.h>
#include <limits.h> #include <limits.h>
#include <dc/vec3f.h>
#include "private.h" #include "private.h"
#define _MIN(x, y) (x < y) ? x : y #define _MIN(x, y) (x < y) ? x : y

View File

@ -1,10 +1,6 @@
#include <string.h> #include <string.h>
#include <stdio.h> #include <stdio.h>
#include <dc/fmath.h>
#include <dc/matrix.h>
#include <dc/matrix3d.h>
#include <dc/vec3f.h>
#include "private.h" #include "private.h"
#include "../include/gl.h" #include "../include/gl.h"
@ -453,40 +449,40 @@ static inline void vec3f_cross(const GLfloat* v1, const GLfloat* v2, GLfloat* re
GL_FORCE_INLINE void vec3f_normalize_sh4(float *v){ GL_FORCE_INLINE void vec3f_normalize_sh4(float *v){
float length, ilength; float length, ilength;
ilength = MATH_fsrra(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]); ilength = MATH_fsrra(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
length = MATH_Fast_Invert(ilength); length = MATH_Fast_Invert(ilength);
if (length) if (length)
{ {
v[0] *= ilength; v[0] *= ilength;
v[1] *= ilength; v[1] *= ilength;
v[2] *= ilength; v[2] *= ilength;
} }
} }
void gluLookAt(GLfloat eyex, GLfloat eyey, GLfloat eyez, GLfloat centerx, void gluLookAt(GLfloat eyex, GLfloat eyey, GLfloat eyez, GLfloat centerx,
GLfloat centery, GLfloat centerz, GLfloat upx, GLfloat upy, GLfloat centery, GLfloat centerz, GLfloat upx, GLfloat upy,
GLfloat upz) { GLfloat upz) {
GLfloat m [16]; GLfloat m [16];
GLfloat f [3]; GLfloat f [3];
GLfloat u [3]; GLfloat u [3];
GLfloat s [3]; GLfloat s [3];
f[0] = centerx - eyex; f[0] = centerx - eyex;
f[1] = centery - eyey; f[1] = centery - eyey;
f[2] = centerz - eyez; f[2] = centerz - eyez;
u[0] = upx; u[0] = upx;
u[1] = upy; u[1] = upy;
u[2] = upz; u[2] = upz;
vec3f_normalize_sh4(f); vec3f_normalize_sh4(f);
vec3f_cross(f, u, s); vec3f_cross(f, u, s);
vec3f_normalize_sh4(s); vec3f_normalize_sh4(s);
vec3f_cross(s, f, u); vec3f_cross(s, f, u);
m[0] = s[0]; m[4] = s[1]; m[8] = s[2]; m[12] = 0.0f; m[0] = s[0]; m[4] = s[1]; m[8] = s[2]; m[12] = 0.0f;
m[1] = u[0]; m[5] = u[1]; m[9] = u[2]; m[13] = 0.0f; m[1] = u[0]; m[5] = u[1]; m[9] = u[2]; m[13] = 0.0f;
m[2] = -f[0]; m[6] = -f[1]; m[10] = -f[2]; m[14] = 0.0f; m[2] = -f[0]; m[6] = -f[1]; m[10] = -f[2]; m[14] = 0.0f;
m[3] = 0.0f; m[7] = 0.0f; m[11] = 0.0f; m[15] = 1.0f; m[3] = 0.0f; m[7] = 0.0f; m[11] = 0.0f; m[15] = 1.0f;
static Matrix4x4 trn __attribute__((aligned(32))) = { static Matrix4x4 trn __attribute__((aligned(32))) = {

View File

@ -1,6 +1,7 @@
#pragma once #pragma once
#include <stdint.h> #include <stdint.h>
#include <stdbool.h>
typedef enum GPUAlpha { typedef enum GPUAlpha {
GPU_ALPHA_DISABLE = 0, GPU_ALPHA_DISABLE = 0,
@ -131,6 +132,15 @@ enum GPUCommand {
GPU_CMD_SPRITE = 0xA0000000 GPU_CMD_SPRITE = 0xA0000000
}; };
void SceneBegin();
void SceneListBegin(GPUList list);
void SceneListSubmit(void* src, int n);
void SceneListFinish();
void SceneFinish();
#ifdef __DREAMCAST__ #ifdef __DREAMCAST__
#include "platforms/sh4.h" #include "platforms/sh4.h"

View File

@ -0,0 +1,64 @@
#include "../platform.h"
#include "sh4.h"
#define TA_SQ_ADDR (unsigned int *)(void *) \
(0xe0000000 | (((unsigned long)0x10000000) & 0x03ffffe0))
#define QACRTA ((((unsigned int)0x10000000)>>26)<<2)&0x1c
void InitGPU(_Bool autosort, _Bool fsaa) {
pvr_init_params_t params = {
/* Enable opaque and translucent polygons with size 32 and 32 */
{PVR_BINSIZE_32, PVR_BINSIZE_0, PVR_BINSIZE_32, PVR_BINSIZE_0, PVR_BINSIZE_32},
PVR_VERTEX_BUF_SIZE, /* Vertex buffer size */
0, /* No DMA */
fsaa, /* No FSAA */
(autosort) ? 0 : 1 /* Disable translucent auto-sorting to match traditional GL */
};
pvr_init(&params);
}
void SceneBegin() {
pvr_wait_ready();
pvr_scene_begin();
QACR0 = QACRTA;
QACR1 = QACRTA;
}
void SceneListBegin(GPUList list) {
pvr_list_begin(list);
}
void SceneListSubmit(void* src, int n) {
GLuint *d = TA_SQ_ADDR;
GLuint *s = src;
/* fill/write queues as many times necessary */
while(n--) {
__asm__("pref @%0" : : "r"(s + 8)); /* prefetch 32 bytes for next loop */
d[0] = *(s++);
d[1] = *(s++);
d[2] = *(s++);
d[3] = *(s++);
d[4] = *(s++);
d[5] = *(s++);
d[6] = *(s++);
d[7] = *(s++);
__asm__("pref @%0" : : "r"(d));
d += 8;
}
/* Wait for both store queues to complete */
d = (GLuint *)0xe0000000;
d[0] = d[8] = 0;
}
void SceneListFinish() {
pvr_list_finish();
}
void SceneFinish() {
pvr_scene_finish();
}

View File

@ -46,3 +46,5 @@ inline void TransformVertices(const Vertex* vertices, const int count) {
it->w = __w; it->w = __w;
} }
} }
void InitGPU(_Bool autosort, _Bool fsaa);

View File

@ -0,0 +1,26 @@
#include "../platform.h"
#include "x86.h"
void InitGPU(_Bool autosort, _Bool fsaa) {
}
void SceneBegin() {
}
void SceneListBegin(GPUList list) {
}
void SceneListSubmit(void* src, int n) {
}
void SceneListFinish() {
}
void SceneFinish() {
}

View File

@ -30,3 +30,5 @@ inline void TransformVertices(const Vertex* vertices, const int count) {
(void) vertices; (void) vertices;
(void) count; (void) count;
} }
void InitGPU(_Bool autosort, _Bool fsaa);

View File

@ -2,6 +2,7 @@
#define PRIVATE_H #define PRIVATE_H
#include <stdint.h> #include <stdint.h>
#include <stdio.h>
#include "platform.h" #include "platform.h"
#include "types.h" #include "types.h"