Draw output buffer

This commit is contained in:
Jeffrey Pfau 2013-04-20 21:40:06 -07:00
parent eba5d547b9
commit 2860714714
2 changed files with 71 additions and 19 deletions

View File

@ -12,7 +12,8 @@ include_directories(${CMAKE_SOURCE_DIR}/src/debugger)
include_directories(${CMAKE_SOURCE_DIR}/third-party/linenoise) include_directories(${CMAKE_SOURCE_DIR}/third-party/linenoise)
find_package(SDL 1.2 REQUIRED) find_package(SDL 1.2 REQUIRED)
include_directories(${SDL_INCLUDE_DIR}) find_package(OpenGL REQUIRED)
include_directories(${SDL_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR})
add_executable(gbac ${ARM_SRC} ${GBA_SRC} ${DEBUGGER_SRC} ${RENDERER_SRC} ${THIRD_PARTY} ${CMAKE_SOURCE_DIR}/src/main.c) add_executable(gbac ${ARM_SRC} ${GBA_SRC} ${DEBUGGER_SRC} ${RENDERER_SRC} ${THIRD_PARTY} ${CMAKE_SOURCE_DIR}/src/main.c)
target_link_libraries(gbac m pthread ${SDL_LIBRARY}) target_link_libraries(gbac m pthread ${SDL_LIBRARY} ${OPENGL_LIBRARY})

View File

@ -3,14 +3,36 @@
#include "renderers/video-software.h" #include "renderers/video-software.h"
#include <sdl.h> #include <sdl.h>
#include <OpenGL/gl.h>
#include <fcntl.h> #include <fcntl.h>
#include <errno.h> #include <errno.h>
#include <signal.h> #include <signal.h>
#include <unistd.h> #include <unistd.h>
static int _GBASDLInit(void); struct GLSoftwareRenderer {
static void _GBASDLRunloop(struct GBAThread* context, struct GBAVideoSoftwareRenderer* renderer); struct GBAVideoSoftwareRenderer d;
GLuint tex;
};
static int _GBASDLInit(struct GLSoftwareRenderer* renderer);
static void _GBASDLDeinit(struct GLSoftwareRenderer* renderer);
static void _GBASDLRunloop(struct GBAThread* context, struct GLSoftwareRenderer* renderer);
static const GLint _glVertices[] = {
0, 0,
256, 0,
256, 256,
0, 256
};
static const GLint _glTexCoords[] = {
0, 0,
1, 0,
1, 1,
0, 1
};
int main(int argc, char** argv) { int main(int argc, char** argv) {
int fd = open("test.rom", O_RDONLY); int fd = open("test.rom", O_RDONLY);
@ -20,15 +42,16 @@ int main(int argc, char** argv) {
sigaddset(&signals, SIGTRAP); sigaddset(&signals, SIGTRAP);
pthread_sigmask(SIG_BLOCK, &signals, 0); pthread_sigmask(SIG_BLOCK, &signals, 0);
if (!_GBASDLInit()) { struct GBAThread context;
struct GLSoftwareRenderer renderer;
GBAVideoSoftwareRendererCreate(&renderer.d);
if (!_GBASDLInit(&renderer)) {
return 1; return 1;
} }
struct GBAThread context;
struct GBAVideoSoftwareRenderer renderer;
GBAVideoSoftwareRendererCreate(&renderer);
context.fd = fd; context.fd = fd;
context.renderer = &renderer.d; context.renderer = &renderer.d.d;
GBAThreadStart(&context); GBAThreadStart(&context);
_GBASDLRunloop(&context, &renderer); _GBASDLRunloop(&context, &renderer);
@ -36,12 +59,12 @@ int main(int argc, char** argv) {
GBAThreadJoin(&context); GBAThreadJoin(&context);
close(fd); close(fd);
SDL_Quit(); _GBASDLDeinit(&renderer);
return 0; return 0;
} }
static int _GBASDLInit() { static int _GBASDLInit(struct GLSoftwareRenderer* renderer) {
if (SDL_Init(SDL_INIT_VIDEO) < 0) { if (SDL_Init(SDL_INIT_VIDEO) < 0) {
return 0; return 0;
} }
@ -53,22 +76,50 @@ static int _GBASDLInit() {
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
SDL_SetVideoMode(240, 160, 16, SDL_OPENGL); SDL_SetVideoMode(240, 160, 16, SDL_OPENGL);
renderer->d.outputBuffer = malloc(256 * 256 * 2);
renderer->d.outputBufferStride = 256;
glGenTextures(1, &renderer->tex);
glBindTexture(GL_TEXTURE_2D, renderer->tex);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glViewport(0, 0, 240, 160);
return 1; return 1;
} }
static void _GBASDLRunloop(struct GBAThread* context, struct GBAVideoSoftwareRenderer* renderer) { static void _GBASDLRunloop(struct GBAThread* context, struct GLSoftwareRenderer* renderer) {
SDL_Event event; SDL_Event event;
while (1) { int err;
if (!context->started) { glEnable(GL_TEXTURE_2D);
break; glEnableClientState(GL_TEXTURE_COORD_ARRAY);
} glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(2, GL_INT, 0, _glVertices);
glTexCoordPointer(2, GL_INT, 0, _glTexCoords);
glMatrixMode (GL_PROJECTION);
glLoadIdentity();
glOrtho(0, 240, 160, 0, 0, 1);
while (context->started) {
glBindTexture(GL_TEXTURE_2D, renderer->tex);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB5, 256, 256, 0, GL_RGBA, GL_UNSIGNED_SHORT_1_5_5_5_REV, renderer->d.outputBuffer);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
SDL_GL_SwapBuffers(); SDL_GL_SwapBuffers();
pthread_mutex_lock(&renderer->mutex); pthread_mutex_lock(&renderer->d.mutex);
pthread_cond_broadcast(&renderer->cond); pthread_cond_broadcast(&renderer->d.cond);
pthread_mutex_unlock(&renderer->mutex); pthread_mutex_unlock(&renderer->d.mutex);
while(SDL_PollEvent(&event)) { while(SDL_PollEvent(&event)) {
} }
} }
} }
static void _GBASDLDeinit(struct GLSoftwareRenderer* renderer) {
free(renderer->d.outputBuffer);
SDL_Quit();
}