mirror of https://github.com/mgba-emu/mgba.git
Start on mode 0 renderer
This commit is contained in:
parent
f6a9467e86
commit
20b67240ae
|
@ -1,5 +1,7 @@
|
||||||
#include "video-glsl.h"
|
#include "video-glsl.h"
|
||||||
|
|
||||||
|
#include "gba-io.h"
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#define UNIFORM_LOCATION(UNIFORM) (glGetUniformLocation(glslRenderer->program, UNIFORM))
|
#define UNIFORM_LOCATION(UNIFORM) (glGetUniformLocation(glslRenderer->program, UNIFORM))
|
||||||
|
@ -10,19 +12,36 @@ static const GLfloat _vertices[4] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static const GLchar* _fragmentShader[] = {
|
static const GLchar* _fragmentShader[] = {
|
||||||
"uniform float y;",
|
"#extension GL_EXT_gpu_shader4 : enable\n",
|
||||||
"uniform sampler2D palette;",
|
"varying float x;\n",
|
||||||
|
"uniform float y;\n",
|
||||||
|
"uniform sampler2D vram;\n",
|
||||||
|
"uniform int bg3cnt;\n",
|
||||||
|
"#define VRAM_INDEX(i) (vec2(mod(float(i), 512.0) / 511.0, (160.0 + floor(float(i) / 512.0)) / 255.0))\n",
|
||||||
|
"#define DESERIALIZE(vec) int(dot(vec4(63488.0, 1984.0, 62.0, 1.0), vec))\n",
|
||||||
|
|
||||||
"void main() {",
|
"void main() {\n",
|
||||||
" gl_FragColor = texture2D(palette, vec2(0, y / 256.0));",
|
" int charBase = ((bg3cnt / 4) & 3) * 8192;\n",
|
||||||
"}"
|
" int screenBase = ((bg3cnt / 256) & 0x1F) * 1024;\n",
|
||||||
|
" int xBase = int(x) & 0xF8;\n",
|
||||||
|
" int yBase = int(y) & 0xF8;\n",
|
||||||
|
" screenBase = screenBase + (xBase / 8) + (yBase * 4);\n",
|
||||||
|
" int mapData = DESERIALIZE(texture2D(vram, VRAM_INDEX(screenBase)));\n",
|
||||||
|
" charBase = charBase + ((mapData & 0x3FF) * 16) + (int(x) & 0x4) / 4 + (int(y) & 0x7) * 2;\n",
|
||||||
|
" int tileData = DESERIALIZE(texture2D(vram, VRAM_INDEX(charBase)));\n",
|
||||||
|
" tileData = ((tileData >> ((int(x) & 3) * 4)) & 0xF) + (mapData / 4096) * 16;\n",
|
||||||
|
" gl_FragColor = texture2D(vram, vec2(float(tileData) / 512.0, y / 256.0));\n",
|
||||||
|
|
||||||
|
"}\n"
|
||||||
};
|
};
|
||||||
|
|
||||||
static const GLchar* _vertexShader[] = {
|
static const GLchar* _vertexShader[] = {
|
||||||
|
"varying float x;",
|
||||||
"attribute vec2 vert;",
|
"attribute vec2 vert;",
|
||||||
"uniform float y;",
|
"uniform float y;",
|
||||||
|
|
||||||
"void main() {",
|
"void main() {",
|
||||||
|
" x = vert.x * 120.0 + 120.0;",
|
||||||
" gl_Position = vec4(vert.x, 1.0 - y / 80.0, 0, 1.0);",
|
" gl_Position = vec4(vert.x, 1.0 - y / 80.0, 0, 1.0);",
|
||||||
"}"
|
"}"
|
||||||
};
|
};
|
||||||
|
@ -50,8 +69,8 @@ void GBAVideoGLSLRendererCreate(struct GBAVideoGLSLRenderer* glslRenderer) {
|
||||||
glslRenderer->vertexShader = glCreateShader(GL_VERTEX_SHADER);
|
glslRenderer->vertexShader = glCreateShader(GL_VERTEX_SHADER);
|
||||||
glslRenderer->program = glCreateProgram();
|
glslRenderer->program = glCreateProgram();
|
||||||
|
|
||||||
glShaderSource(glslRenderer->fragmentShader, 5, _fragmentShader, 0);
|
glShaderSource(glslRenderer->fragmentShader, 19, _fragmentShader, 0);
|
||||||
glShaderSource(glslRenderer->vertexShader, 5, _vertexShader, 0);
|
glShaderSource(glslRenderer->vertexShader, 7, _vertexShader, 0);
|
||||||
|
|
||||||
glAttachShader(glslRenderer->program, glslRenderer->vertexShader);
|
glAttachShader(glslRenderer->program, glslRenderer->vertexShader);
|
||||||
glAttachShader(glslRenderer->program, glslRenderer->fragmentShader);
|
glAttachShader(glslRenderer->program, glslRenderer->fragmentShader);
|
||||||
|
@ -107,6 +126,9 @@ static void GBAVideoGLSLRendererInit(struct GBAVideoRenderer* renderer) {
|
||||||
glslRenderer->state = GLSL_NONE;
|
glslRenderer->state = GLSL_NONE;
|
||||||
glslRenderer->y = 0;
|
glslRenderer->y = 0;
|
||||||
|
|
||||||
|
glslRenderer->oldVram = renderer->vram;
|
||||||
|
renderer->vram = &glslRenderer->vram[512 * 160];
|
||||||
|
|
||||||
pthread_mutex_init(&glslRenderer->mutex, 0);
|
pthread_mutex_init(&glslRenderer->mutex, 0);
|
||||||
pthread_cond_init(&glslRenderer->upCond, 0);
|
pthread_cond_init(&glslRenderer->upCond, 0);
|
||||||
pthread_cond_init(&glslRenderer->downCond, 0);
|
pthread_cond_init(&glslRenderer->downCond, 0);
|
||||||
|
@ -121,6 +143,8 @@ static void GBAVideoGLSLRendererDeinit(struct GBAVideoRenderer* renderer) {
|
||||||
|
|
||||||
glDeleteTextures(1, &glslRenderer->paletteTexture);*/
|
glDeleteTextures(1, &glslRenderer->paletteTexture);*/
|
||||||
|
|
||||||
|
renderer->vram = glslRenderer->oldVram;
|
||||||
|
|
||||||
pthread_mutex_lock(&glslRenderer->mutex);
|
pthread_mutex_lock(&glslRenderer->mutex);
|
||||||
pthread_cond_broadcast(&glslRenderer->upCond);
|
pthread_cond_broadcast(&glslRenderer->upCond);
|
||||||
pthread_mutex_unlock(&glslRenderer->mutex);
|
pthread_mutex_unlock(&glslRenderer->mutex);
|
||||||
|
@ -141,8 +165,7 @@ static void GBAVideoGLSLRendererWritePalette(struct GBAVideoRenderer* renderer,
|
||||||
|
|
||||||
static uint16_t GBAVideoGLSLRendererWriteVideoRegister(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value) {
|
static uint16_t GBAVideoGLSLRendererWriteVideoRegister(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value) {
|
||||||
struct GBAVideoGLSLRenderer* glslRenderer = (struct GBAVideoGLSLRenderer*) renderer;
|
struct GBAVideoGLSLRenderer* glslRenderer = (struct GBAVideoGLSLRenderer*) renderer;
|
||||||
(void)(glslRenderer);
|
glslRenderer->io[glslRenderer->y][address >> 1] = value;
|
||||||
(void)(address);
|
|
||||||
|
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
@ -153,9 +176,11 @@ static void GBAVideoGLSLRendererDrawScanline(struct GBAVideoRenderer* renderer,
|
||||||
glslRenderer->y = y + 1;
|
glslRenderer->y = y + 1;
|
||||||
if (y + 1 < VIDEO_VERTICAL_PIXELS) {
|
if (y + 1 < VIDEO_VERTICAL_PIXELS) {
|
||||||
memcpy(&glslRenderer->vram[(y + 1) * 512], &glslRenderer->vram[y * 512], 1024);
|
memcpy(&glslRenderer->vram[(y + 1) * 512], &glslRenderer->vram[y * 512], 1024);
|
||||||
|
memcpy(glslRenderer->io[y + 1], glslRenderer->io[y], sizeof(*glslRenderer->io));
|
||||||
} else {
|
} else {
|
||||||
glslRenderer->y = 0;
|
glslRenderer->y = 0;
|
||||||
memcpy(&glslRenderer->vram[0], &glslRenderer->vram[y * 512], 1024);
|
memcpy(&glslRenderer->vram[0], &glslRenderer->vram[y * 512], 1024);
|
||||||
|
memcpy(glslRenderer->io[0], glslRenderer->io[y], sizeof(*glslRenderer->io));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,9 @@ struct GBAVideoGLSLRenderer {
|
||||||
|
|
||||||
GLuint vramTexture;
|
GLuint vramTexture;
|
||||||
GLushort vram[512 * 256];
|
GLushort vram[512 * 256];
|
||||||
|
GLushort io[160][0x30];
|
||||||
|
|
||||||
|
uint16_t* oldVram;
|
||||||
|
|
||||||
pthread_mutex_t mutex;
|
pthread_mutex_t mutex;
|
||||||
pthread_cond_t upCond;
|
pthread_cond_t upCond;
|
||||||
|
|
Loading…
Reference in New Issue