mirror of https://github.com/mgba-emu/mgba.git
GBA Video: Start GL renderer
This commit is contained in:
parent
82ef919ee2
commit
618ddac387
|
@ -17,6 +17,7 @@
|
||||||
#ifndef DISABLE_THREADING
|
#ifndef DISABLE_THREADING
|
||||||
#include <mgba/feature/thread-proxy.h>
|
#include <mgba/feature/thread-proxy.h>
|
||||||
#endif
|
#endif
|
||||||
|
#include <mgba/internal/gba/renderers/gl.h>
|
||||||
#include <mgba/internal/gba/renderers/proxy.h>
|
#include <mgba/internal/gba/renderers/proxy.h>
|
||||||
#include <mgba/internal/gba/renderers/video-software.h>
|
#include <mgba/internal/gba/renderers/video-software.h>
|
||||||
#include <mgba/internal/gba/savedata.h>
|
#include <mgba/internal/gba/savedata.h>
|
||||||
|
@ -123,6 +124,7 @@ struct mVideoLogContext;
|
||||||
struct GBACore {
|
struct GBACore {
|
||||||
struct mCore d;
|
struct mCore d;
|
||||||
struct GBAVideoSoftwareRenderer renderer;
|
struct GBAVideoSoftwareRenderer renderer;
|
||||||
|
struct GBAVideoGLRenderer glRenderer;
|
||||||
struct GBAVideoProxyRenderer proxyRenderer;
|
struct GBAVideoProxyRenderer proxyRenderer;
|
||||||
struct mVideoLogContext* logContext;
|
struct mVideoLogContext* logContext;
|
||||||
struct mCoreCallbacks logCallbacks;
|
struct mCoreCallbacks logCallbacks;
|
||||||
|
@ -166,6 +168,7 @@ static bool _GBACoreInit(struct mCore* core) {
|
||||||
gba->rtcSource = &core->rtc.d;
|
gba->rtcSource = &core->rtc.d;
|
||||||
|
|
||||||
GBAVideoSoftwareRendererCreate(&gbacore->renderer);
|
GBAVideoSoftwareRendererCreate(&gbacore->renderer);
|
||||||
|
GBAVideoGLRendererCreate(&gbacore->glRenderer);
|
||||||
gbacore->renderer.outputBuffer = NULL;
|
gbacore->renderer.outputBuffer = NULL;
|
||||||
|
|
||||||
#ifndef DISABLE_THREADING
|
#ifndef DISABLE_THREADING
|
||||||
|
@ -251,6 +254,7 @@ static void _GBACoreLoadConfig(struct mCore* core, const struct mCoreConfig* con
|
||||||
#ifndef DISABLE_THREADING
|
#ifndef DISABLE_THREADING
|
||||||
mCoreConfigCopyValue(&core->config, config, "threadedVideo");
|
mCoreConfigCopyValue(&core->config, config, "threadedVideo");
|
||||||
#endif
|
#endif
|
||||||
|
mCoreConfigCopyValue(&core->config, config, "hwaccelVideo");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _GBACoreDesiredVideoDimensions(struct mCore* core, unsigned* width, unsigned* height) {
|
static void _GBACoreDesiredVideoDimensions(struct mCore* core, unsigned* width, unsigned* height) {
|
||||||
|
@ -390,14 +394,17 @@ static void _GBACoreReset(struct mCore* core) {
|
||||||
struct GBA* gba = (struct GBA*) core->board;
|
struct GBA* gba = (struct GBA*) core->board;
|
||||||
if (gbacore->renderer.outputBuffer) {
|
if (gbacore->renderer.outputBuffer) {
|
||||||
struct GBAVideoRenderer* renderer = &gbacore->renderer.d;
|
struct GBAVideoRenderer* renderer = &gbacore->renderer.d;
|
||||||
#ifndef DISABLE_THREADING
|
|
||||||
int fakeBool;
|
int fakeBool;
|
||||||
|
#ifndef DISABLE_THREADING
|
||||||
if (mCoreConfigGetIntValue(&core->config, "threadedVideo", &fakeBool) && fakeBool) {
|
if (mCoreConfigGetIntValue(&core->config, "threadedVideo", &fakeBool) && fakeBool) {
|
||||||
if (!core->videoLogger) {
|
if (!core->videoLogger) {
|
||||||
core->videoLogger = &gbacore->threadProxy.d;
|
core->videoLogger = &gbacore->threadProxy.d;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
if (mCoreConfigGetIntValue(&core->config, "hwaccelVideo", &fakeBool) && fakeBool) {
|
||||||
|
renderer = &gbacore->glRenderer.d;
|
||||||
|
}
|
||||||
if (core->videoLogger) {
|
if (core->videoLogger) {
|
||||||
gbacore->proxyRenderer.logger = core->videoLogger;
|
gbacore->proxyRenderer.logger = core->videoLogger;
|
||||||
GBAVideoProxyRendererCreate(&gbacore->proxyRenderer, renderer);
|
GBAVideoProxyRendererCreate(&gbacore->proxyRenderer, renderer);
|
||||||
|
|
|
@ -0,0 +1,90 @@
|
||||||
|
/* Copyright (c) 2013-2019 Jeffrey Pfau
|
||||||
|
*
|
||||||
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
||||||
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||||
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||||
|
#include <mgba/internal/gba/renderers/gl.h>
|
||||||
|
|
||||||
|
#include <mgba/core/cache-set.h>
|
||||||
|
#include <mgba/internal/arm/macros.h>
|
||||||
|
#include <mgba/internal/gba/io.h>
|
||||||
|
#include <mgba/internal/gba/renderers/cache-set.h>
|
||||||
|
|
||||||
|
static void GBAVideoGLRendererInit(struct GBAVideoRenderer* renderer);
|
||||||
|
static void GBAVideoGLRendererDeinit(struct GBAVideoRenderer* renderer);
|
||||||
|
static void GBAVideoGLRendererReset(struct GBAVideoRenderer* renderer);
|
||||||
|
static void GBAVideoGLRendererWriteVRAM(struct GBAVideoRenderer* renderer, uint32_t address);
|
||||||
|
static void GBAVideoGLRendererWriteOAM(struct GBAVideoRenderer* renderer, uint32_t oam);
|
||||||
|
static void GBAVideoGLRendererWritePalette(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value);
|
||||||
|
static uint16_t GBAVideoGLRendererWriteVideoRegister(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value);
|
||||||
|
static void GBAVideoGLRendererDrawScanline(struct GBAVideoRenderer* renderer, int y);
|
||||||
|
static void GBAVideoGLRendererFinishFrame(struct GBAVideoRenderer* renderer);
|
||||||
|
static void GBAVideoGLRendererGetPixels(struct GBAVideoRenderer* renderer, size_t* stride, const void** pixels);
|
||||||
|
static void GBAVideoGLRendererPutPixels(struct GBAVideoRenderer* renderer, size_t stride, const void* pixels);
|
||||||
|
|
||||||
|
void GBAVideoGLRendererCreate(struct GBAVideoGLRenderer* renderer) {
|
||||||
|
renderer->d.init = GBAVideoGLRendererInit;
|
||||||
|
renderer->d.reset = GBAVideoGLRendererReset;
|
||||||
|
renderer->d.deinit = GBAVideoGLRendererDeinit;
|
||||||
|
renderer->d.writeVideoRegister = GBAVideoGLRendererWriteVideoRegister;
|
||||||
|
renderer->d.writeVRAM = GBAVideoGLRendererWriteVRAM;
|
||||||
|
renderer->d.writeOAM = GBAVideoGLRendererWriteOAM;
|
||||||
|
renderer->d.writePalette = GBAVideoGLRendererWritePalette;
|
||||||
|
renderer->d.drawScanline = GBAVideoGLRendererDrawScanline;
|
||||||
|
renderer->d.finishFrame = GBAVideoGLRendererFinishFrame;
|
||||||
|
renderer->d.getPixels = GBAVideoGLRendererGetPixels;
|
||||||
|
renderer->d.putPixels = GBAVideoGLRendererPutPixels;
|
||||||
|
|
||||||
|
renderer->d.disableBG[0] = false;
|
||||||
|
renderer->d.disableBG[1] = false;
|
||||||
|
renderer->d.disableBG[2] = false;
|
||||||
|
renderer->d.disableBG[3] = false;
|
||||||
|
renderer->d.disableOBJ = false;
|
||||||
|
|
||||||
|
renderer->temporaryBuffer = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void GBAVideoGLRendererInit(struct GBAVideoRenderer* renderer) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void GBAVideoGLRendererDeinit(struct GBAVideoRenderer* renderer) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void GBAVideoGLRendererReset(struct GBAVideoRenderer* renderer) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void GBAVideoGLRendererWriteVRAM(struct GBAVideoRenderer* renderer, uint32_t address) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void GBAVideoGLRendererWriteOAM(struct GBAVideoRenderer* renderer, uint32_t oam) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void GBAVideoGLRendererWritePalette(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t GBAVideoGLRendererWriteVideoRegister(struct GBAVideoRenderer* renderer, uint32_t address, uint16_t value) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void GBAVideoGLRendererDrawScanline(struct GBAVideoRenderer* renderer, int y) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void GBAVideoGLRendererFinishFrame(struct GBAVideoRenderer* renderer) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void GBAVideoGLRendererGetPixels(struct GBAVideoRenderer* renderer, size_t* stride, const void** pixels) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void GBAVideoGLRendererPutPixels(struct GBAVideoRenderer* renderer, size_t stride, const void* pixels) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -287,14 +287,19 @@ void PainterGL::resizeContext() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!m_active) {
|
||||||
m_gl->makeCurrent();
|
m_gl->makeCurrent();
|
||||||
#if defined(_WIN32) && defined(USE_EPOXY)
|
#if defined(_WIN32) && defined(USE_EPOXY)
|
||||||
epoxy_handle_external_wglMakeCurrent();
|
epoxy_handle_external_wglMakeCurrent();
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
QSize size = m_context->screenDimensions();
|
QSize size = m_context->screenDimensions();
|
||||||
m_backend->setDimensions(m_backend, size.width(), size.height());
|
m_backend->setDimensions(m_backend, size.width(), size.height());
|
||||||
|
if (!m_active) {
|
||||||
m_gl->doneCurrent();
|
m_gl->doneCurrent();
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void PainterGL::setMessagePainter(MessagePainter* messagePainter) {
|
void PainterGL::setMessagePainter(MessagePainter* messagePainter) {
|
||||||
m_messagePainter = messagePainter;
|
m_messagePainter = messagePainter;
|
||||||
|
@ -340,7 +345,6 @@ void PainterGL::start() {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
m_gl->doneCurrent();
|
|
||||||
m_active = true;
|
m_active = true;
|
||||||
m_started = true;
|
m_started = true;
|
||||||
}
|
}
|
||||||
|
@ -383,10 +387,6 @@ void PainterGL::forceDraw() {
|
||||||
void PainterGL::stop() {
|
void PainterGL::stop() {
|
||||||
m_active = false;
|
m_active = false;
|
||||||
m_started = false;
|
m_started = false;
|
||||||
m_gl->makeCurrent();
|
|
||||||
#if defined(_WIN32) && defined(USE_EPOXY)
|
|
||||||
epoxy_handle_external_wglMakeCurrent();
|
|
||||||
#endif
|
|
||||||
dequeueAll();
|
dequeueAll();
|
||||||
m_backend->clear(m_backend);
|
m_backend->clear(m_backend);
|
||||||
m_backend->swap(m_backend);
|
m_backend->swap(m_backend);
|
||||||
|
@ -463,11 +463,13 @@ void PainterGL::setShaders(struct VDir* dir) {
|
||||||
if (!supportsShaders()) {
|
if (!supportsShaders()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (!m_active) {
|
||||||
#if !defined(_WIN32) || defined(USE_EPOXY)
|
#if !defined(_WIN32) || defined(USE_EPOXY)
|
||||||
m_gl->makeCurrent();
|
m_gl->makeCurrent();
|
||||||
#if defined(_WIN32) && defined(USE_EPOXY)
|
#if defined(_WIN32) && defined(USE_EPOXY)
|
||||||
epoxy_handle_external_wglMakeCurrent();
|
epoxy_handle_external_wglMakeCurrent();
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
if (m_shader.passes) {
|
if (m_shader.passes) {
|
||||||
mGLES2ShaderDetach(reinterpret_cast<mGLES2Context*>(m_backend));
|
mGLES2ShaderDetach(reinterpret_cast<mGLES2Context*>(m_backend));
|
||||||
mGLES2ShaderFree(&m_shader);
|
mGLES2ShaderFree(&m_shader);
|
||||||
|
@ -476,7 +478,9 @@ void PainterGL::setShaders(struct VDir* dir) {
|
||||||
if (m_started) {
|
if (m_started) {
|
||||||
mGLES2ShaderAttach(reinterpret_cast<mGLES2Context*>(m_backend), static_cast<mGLES2Shader*>(m_shader.passes), m_shader.nPasses);
|
mGLES2ShaderAttach(reinterpret_cast<mGLES2Context*>(m_backend), static_cast<mGLES2Shader*>(m_shader.passes), m_shader.nPasses);
|
||||||
}
|
}
|
||||||
|
if (!m_active) {
|
||||||
m_gl->doneCurrent();
|
m_gl->doneCurrent();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -484,16 +488,20 @@ void PainterGL::clearShaders() {
|
||||||
if (!supportsShaders()) {
|
if (!supportsShaders()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (!m_active) {
|
||||||
#if !defined(_WIN32) || defined(USE_EPOXY)
|
#if !defined(_WIN32) || defined(USE_EPOXY)
|
||||||
m_gl->makeCurrent();
|
m_gl->makeCurrent();
|
||||||
#if defined(_WIN32) && defined(USE_EPOXY)
|
#if defined(_WIN32) && defined(USE_EPOXY)
|
||||||
epoxy_handle_external_wglMakeCurrent();
|
epoxy_handle_external_wglMakeCurrent();
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
if (m_shader.passes) {
|
if (m_shader.passes) {
|
||||||
mGLES2ShaderDetach(reinterpret_cast<mGLES2Context*>(m_backend));
|
mGLES2ShaderDetach(reinterpret_cast<mGLES2Context*>(m_backend));
|
||||||
mGLES2ShaderFree(&m_shader);
|
mGLES2ShaderFree(&m_shader);
|
||||||
}
|
}
|
||||||
|
if (!m_active) {
|
||||||
m_gl->doneCurrent();
|
m_gl->doneCurrent();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue