diff --git a/CMakeLists.txt b/CMakeLists.txt index 2b5631f81..b2da66770 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,10 +3,12 @@ project(GBAc) set(CMAKE_C_FLAGS_DEBUG "-g -Wall -Wextra") file(GLOB ARM_SRC ${CMAKE_SOURCE_DIR}/src/arm/*.c) file(GLOB GBA_SRC ${CMAKE_SOURCE_DIR}/src/gba/*.c) +file(GLOB RENDERER_SRC ${CMAKE_SOURCE_DIR}/src/gba/renderers/*.c) file(GLOB DEBUGGER_SRC ${CMAKE_SOURCE_DIR}/src/debugger/*.c) file(GLOB THIRD_PARTY ${CMAKE_SOURCE_DIR}/third-party/linenoise/linenoise.c) include_directories(${CMAKE_SOURCE_DIR}/src/arm) include_directories(${CMAKE_SOURCE_DIR}/src/gba) include_directories(${CMAKE_SOURCE_DIR}/src/debugger) include_directories(${CMAKE_SOURCE_DIR}/third-party/linenoise) -add_executable(gbac ${ARM_SRC} ${GBA_SRC} ${DEBUGGER_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) diff --git a/src/gba/renderers/video-software.c b/src/gba/renderers/video-software.c new file mode 100644 index 000000000..70439243b --- /dev/null +++ b/src/gba/renderers/video-software.c @@ -0,0 +1,38 @@ +#include "video-software.h" + +#include "gba.h" + +static void GBAVideoSoftwareRendererInit(struct GBAVideoRenderer* renderer); +static void GBAVideoSoftwareRendererDeinit(struct GBAVideoRenderer* renderer); +static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value); +static void GBAVideoSoftwareRendererDrawScanline(struct GBAVideoRenderer* renderer, int y); +static void GBAVideoSoftwareRendererFinishFrame(struct GBAVideoRenderer* renderer); + +void GBAVideoSoftwareRendererCreate(struct GBAVideoSoftwareRenderer* renderer) { + renderer->d.init = GBAVideoSoftwareRendererInit; + renderer->d.deinit = GBAVideoSoftwareRendererDeinit; + renderer->d.writeVideoRegister = GBAVideoSoftwareRendererWriteVideoRegister; + renderer->d.drawScanline = GBAVideoSoftwareRendererDrawScanline; + renderer->d.finishFrame = GBAVideoSoftwareRendererFinishFrame; +} + +static void GBAVideoSoftwareRendererInit(struct GBAVideoRenderer* renderer) { + struct GBAVideoSoftwareRenderer* softwareRenderer = (struct GBAVideoSoftwareRenderer*) renderer; +} + +static void GBAVideoSoftwareRendererDeinit(struct GBAVideoRenderer* renderer) { + struct GBAVideoSoftwareRenderer* softwareRenderer = (struct GBAVideoSoftwareRenderer*) renderer; +} + +static uint16_t GBAVideoSoftwareRendererWriteVideoRegister(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value) { + struct GBAVideoSoftwareRenderer* softwareRenderer = (struct GBAVideoSoftwareRenderer*) renderer; + return value; +} + +static void GBAVideoSoftwareRendererDrawScanline(struct GBAVideoRenderer* renderer, int y) { + struct GBAVideoSoftwareRenderer* softwareRenderer = (struct GBAVideoSoftwareRenderer*) renderer; +} + +static void GBAVideoSoftwareRendererFinishFrame(struct GBAVideoRenderer* renderer) { + struct GBAVideoSoftwareRenderer* softwareRenderer = (struct GBAVideoSoftwareRenderer*) renderer; +} diff --git a/src/gba/renderers/video-software.h b/src/gba/renderers/video-software.h new file mode 100644 index 000000000..8632850e7 --- /dev/null +++ b/src/gba/renderers/video-software.h @@ -0,0 +1,20 @@ +#ifndef VIDEO_SOFTWARE_H +#define VIDEO_SOFTWARE_H + +#include "gba-video.h" + +#include + +struct GBAVideoSoftwareRenderer { + struct GBAVideoRenderer d; + + uint16_t* outputBuffer; + unsigned outputBufferStride; + + pthread_mutex_t mutex; + pthread_cond_t cond; +}; + +void GBAVideoSoftwareRendererCreate(struct GBAVideoSoftwareRenderer* renderer); + +#endif