CMake: Attempt to fix #1839 again

This commit is contained in:
Vicki Pfau 2021-08-28 22:05:49 -07:00
parent c6167470eb
commit bc37f48e29
6 changed files with 38 additions and 18 deletions

View File

@ -79,7 +79,7 @@ if(NOT LIBMGBA_ONLY)
set(SKIP_LIBRARY OFF CACHE BOOL "Skip building the library (useful for only building libretro or OpenEmu cores)") set(SKIP_LIBRARY OFF CACHE BOOL "Skip building the library (useful for only building libretro or OpenEmu cores)")
set(BUILD_GL ON CACHE BOOL "Build with OpenGL") set(BUILD_GL ON CACHE BOOL "Build with OpenGL")
set(BUILD_GLES2 ON CACHE BOOL "Build with OpenGL|ES 2") set(BUILD_GLES2 ON CACHE BOOL "Build with OpenGL|ES 2")
set(BUILD_GLES3 OFF CACHE BOOL "Build with OpenGL|ES 3") set(BUILD_GLES3 ON CACHE BOOL "Build with OpenGL|ES 3")
set(USE_EPOXY ON CACHE STRING "Build with libepoxy") set(USE_EPOXY ON CACHE STRING "Build with libepoxy")
set(DISABLE_DEPS OFF CACHE BOOL "Build without dependencies") set(DISABLE_DEPS OFF CACHE BOOL "Build without dependencies")
set(DISTBUILD OFF CACHE BOOL "Build distribution packages") set(DISTBUILD OFF CACHE BOOL "Build distribution packages")
@ -408,14 +408,14 @@ endif()
if(NOT BUILD_GL AND NOT LIBMGBA_ONLY) if(NOT BUILD_GL AND NOT LIBMGBA_ONLY)
set(OPENGL_LIBRARY "" CACHE PATH "" FORCE) set(OPENGL_LIBRARY "" CACHE PATH "" FORCE)
endif() endif()
if(BUILD_GLES2 AND NOT BUILD_RASPI AND NOT CMAKE_SYSTEM_NAME MATCHES "^(Windows|Darwin|Linux|.*BSD|DragonFly|Haiku)$") if(BUILD_GLES2 AND NOT BUILD_GL)
find_path(OPENGLES2_INCLUDE_DIR NAMES GLES2/gl2.h) find_path(OPENGLES2_INCLUDE_DIR NAMES GLES2/gl2.h)
find_library(OPENGLES2_LIBRARY NAMES GLESv2 GLESv2_CM) find_library(OPENGLES2_LIBRARY NAMES GLESv2 GLESv2_CM)
if(NOT OPENGLES2_INCLUDE_DIR OR NOT OPENGLES2_LIBRARY) if(NOT OPENGLES2_INCLUDE_DIR OR NOT OPENGLES2_LIBRARY)
set(BUILD_GLES2 OFF CACHE BOOL "OpenGL|ES 2 not found" FORCE) set(BUILD_GLES2 OFF CACHE BOOL "OpenGL|ES 2 not found" FORCE)
endif() endif()
endif() endif()
if(NOT BUILD_GLES2 AND NOT LIBMGBA_ONLY) if(NOT BUILD_GLES2 AND NOT BUILD_GLES3 AND NOT LIBMGBA_ONLY)
set(OPENGLES2_LIBRARY "" CACHE PATH "" FORCE) set(OPENGLES2_LIBRARY "" CACHE PATH "" FORCE)
endif() endif()
if(BUILD_GL) if(BUILD_GL)
@ -436,6 +436,8 @@ if(BUILD_GLES3)
list(APPEND FEATURE_DEFINES BUILD_GLES3) list(APPEND FEATURE_DEFINES BUILD_GLES3)
if(NOT OPENGLES3_INCLUDE_DIR OR NOT OPENGLES3_LIBRARY) if(NOT OPENGLES3_INCLUDE_DIR OR NOT OPENGLES3_LIBRARY)
set(BUILD_GLES3 OFF CACHE BOOL "OpenGL|ES 3 not found" FORCE) set(BUILD_GLES3 OFF CACHE BOOL "OpenGL|ES 3 not found" FORCE)
else()
set(OPENGLES2_LIBRARY ${OPENGLES3_LIBRARY} CACHE PATH "" FORCE)
endif() endif()
endif() endif()
@ -678,7 +680,7 @@ endif()
if(USE_EPOXY) if(USE_EPOXY)
list(APPEND FEATURE_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/opengl/gl.c ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/opengl/gles2.c) list(APPEND FEATURE_SRC ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/opengl/gl.c ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/opengl/gles2.c)
list(APPEND FEATURE_DEFINES BUILD_GL BUILD_GLES2) list(APPEND FEATURE_DEFINES BUILD_GL BUILD_GLES2 BUILD_GLES3)
list(APPEND FEATURES EPOXY) list(APPEND FEATURES EPOXY)
include_directories(AFTER ${EPOXY_INCLUDE_DIRS}) include_directories(AFTER ${EPOXY_INCLUDE_DIRS})
link_directories(${EPOXY_LIBRARY_DIRS}) link_directories(${EPOXY_LIBRARY_DIRS})

View File

@ -16,7 +16,7 @@ CXX_GUARD_START
#include <mgba/internal/gba/renderers/common.h> #include <mgba/internal/gba/renderers/common.h>
#include <mgba/internal/gba/video.h> #include <mgba/internal/gba/video.h>
#if defined(BUILD_GLES2) || defined(BUILD_GLES3) #ifdef BUILD_GLES3
#ifdef USE_EPOXY #ifdef USE_EPOXY
#include <epoxy/gl.h> #include <epoxy/gl.h>

View File

@ -18,7 +18,7 @@
#ifndef DISABLE_THREADING #ifndef DISABLE_THREADING
#include <mgba/feature/thread-proxy.h> #include <mgba/feature/thread-proxy.h>
#endif #endif
#if defined(BUILD_GLES2) || defined(BUILD_GLES3) #ifdef BUILD_GLES3
#include <mgba/internal/gba/renderers/gl.h> #include <mgba/internal/gba/renderers/gl.h>
#endif #endif
#include <mgba/internal/gba/renderers/proxy.h> #include <mgba/internal/gba/renderers/proxy.h>
@ -134,7 +134,7 @@ struct GBACore {
struct mCore d; struct mCore d;
struct GBAVideoRenderer dummyRenderer; struct GBAVideoRenderer dummyRenderer;
struct GBAVideoSoftwareRenderer renderer; struct GBAVideoSoftwareRenderer renderer;
#if defined(BUILD_GLES2) || defined(BUILD_GLES3) #ifdef BUILD_GLES3
struct GBAVideoGLRenderer glRenderer; struct GBAVideoGLRenderer glRenderer;
#endif #endif
#ifndef MINIMAL_CORE #ifndef MINIMAL_CORE
@ -192,7 +192,7 @@ static bool _GBACoreInit(struct mCore* core) {
GBAVideoSoftwareRendererCreate(&gbacore->renderer); GBAVideoSoftwareRendererCreate(&gbacore->renderer);
gbacore->renderer.outputBuffer = NULL; gbacore->renderer.outputBuffer = NULL;
#if defined(BUILD_GLES2) || defined(BUILD_GLES3) #ifdef BUILD_GLES3
GBAVideoGLRendererCreate(&gbacore->glRenderer); GBAVideoGLRendererCreate(&gbacore->glRenderer);
gbacore->glRenderer.outputTex = -1; gbacore->glRenderer.outputTex = -1;
#endif #endif
@ -248,7 +248,7 @@ static bool _GBACoreSupportsFeature(const struct mCore* core, enum mCoreFeature
UNUSED(core); UNUSED(core);
switch (feature) { switch (feature) {
case mCORE_FEATURE_OPENGL: case mCORE_FEATURE_OPENGL:
#if defined(BUILD_GLES2) || defined(BUILD_GLES3) #ifdef BUILD_GLES3
return true; return true;
#else #else
return false; return false;
@ -362,7 +362,7 @@ static void _GBACoreReloadConfigOption(struct mCore* core, const char* option, c
} }
struct GBACore* gbacore = (struct GBACore*) core; struct GBACore* gbacore = (struct GBACore*) core;
#if defined(BUILD_GLES2) || defined(BUILD_GLES3) #ifdef BUILD_GLES3
if (strcmp("videoScale", option) == 0) { if (strcmp("videoScale", option) == 0) {
if (config != &core->config) { if (config != &core->config) {
mCoreConfigCopyValue(&core->config, config, "videoScale"); mCoreConfigCopyValue(&core->config, config, "videoScale");
@ -380,7 +380,7 @@ static void _GBACoreReloadConfigOption(struct mCore* core, const char* option, c
if (gbacore->renderer.outputBuffer) { if (gbacore->renderer.outputBuffer) {
renderer = &gbacore->renderer.d; renderer = &gbacore->renderer.d;
} }
#if defined(BUILD_GLES2) || defined(BUILD_GLES3) #ifdef BUILD_GLES3
if (gbacore->glRenderer.outputTex != (unsigned) -1 && mCoreConfigGetIntValue(&core->config, "hwaccelVideo", &fakeBool) && fakeBool) { if (gbacore->glRenderer.outputTex != (unsigned) -1 && mCoreConfigGetIntValue(&core->config, "hwaccelVideo", &fakeBool) && fakeBool) {
mCoreConfigGetIntValue(&core->config, "videoScale", &gbacore->glRenderer.scale); mCoreConfigGetIntValue(&core->config, "videoScale", &gbacore->glRenderer.scale);
renderer = &gbacore->glRenderer.d; renderer = &gbacore->glRenderer.d;
@ -402,7 +402,7 @@ static void _GBACoreReloadConfigOption(struct mCore* core, const char* option, c
} }
static void _GBACoreDesiredVideoDimensions(const struct mCore* core, unsigned* width, unsigned* height) { static void _GBACoreDesiredVideoDimensions(const struct mCore* core, unsigned* width, unsigned* height) {
#if defined(BUILD_GLES2) || defined(BUILD_GLES3) #ifdef BUILD_GLES3
const struct GBACore* gbacore = (const struct GBACore*) core; const struct GBACore* gbacore = (const struct GBACore*) core;
int scale = gbacore->glRenderer.scale; int scale = gbacore->glRenderer.scale;
#else #else
@ -422,7 +422,7 @@ static void _GBACoreSetVideoBuffer(struct mCore* core, color_t* buffer, size_t s
} }
static void _GBACoreSetVideoGLTex(struct mCore* core, unsigned texid) { static void _GBACoreSetVideoGLTex(struct mCore* core, unsigned texid) {
#if defined(BUILD_GLES2) || defined(BUILD_GLES3) #ifdef BUILD_GLES3
struct GBACore* gbacore = (struct GBACore*) core; struct GBACore* gbacore = (struct GBACore*) core;
gbacore->glRenderer.outputTex = texid; gbacore->glRenderer.outputTex = texid;
#else #else
@ -562,7 +562,7 @@ static void _GBACoreReset(struct mCore* core) {
struct GBA* gba = (struct GBA*) core->board; struct GBA* gba = (struct GBA*) core->board;
int fakeBool; int fakeBool;
if (gbacore->renderer.outputBuffer if (gbacore->renderer.outputBuffer
#if defined(BUILD_GLES2) || defined(BUILD_GLES3) #ifdef BUILD_GLES3
|| gbacore->glRenderer.outputTex != (unsigned) -1 || gbacore->glRenderer.outputTex != (unsigned) -1
#endif #endif
) { ) {
@ -570,7 +570,7 @@ static void _GBACoreReset(struct mCore* core) {
if (gbacore->renderer.outputBuffer) { if (gbacore->renderer.outputBuffer) {
renderer = &gbacore->renderer.d; renderer = &gbacore->renderer.d;
} }
#if defined(BUILD_GLES2) || defined(BUILD_GLES3) #ifdef BUILD_GLES3
if (gbacore->glRenderer.outputTex != (unsigned) -1 && mCoreConfigGetIntValue(&core->config, "hwaccelVideo", &fakeBool) && fakeBool) { if (gbacore->glRenderer.outputTex != (unsigned) -1 && mCoreConfigGetIntValue(&core->config, "hwaccelVideo", &fakeBool) && fakeBool) {
mCoreConfigGetIntValue(&core->config, "videoScale", &gbacore->glRenderer.scale); mCoreConfigGetIntValue(&core->config, "videoScale", &gbacore->glRenderer.scale);
renderer = &gbacore->glRenderer.d; renderer = &gbacore->glRenderer.d;

View File

@ -5,7 +5,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include <mgba/internal/gba/renderers/gl.h> #include <mgba/internal/gba/renderers/gl.h>
#if defined(BUILD_GLES2) || defined(BUILD_GLES3) #ifdef BUILD_GLES3
#include <mgba/core/cache-set.h> #include <mgba/core/cache-set.h>
#include <mgba/internal/arm/macros.h> #include <mgba/internal/arm/macros.h>

View File

@ -159,6 +159,7 @@ static void mGLES2ContextInit(struct VideoBackend* v, WHandle handle) {
mGLES2ShaderInit(&context->finalShader, 0, 0, 0, 0, false, 0, 0); mGLES2ShaderInit(&context->finalShader, 0, 0, 0, 0, false, 0, 0);
mGLES2ShaderInit(&context->interframeShader, 0, _interframeFragmentShader, -1, -1, false, 0, 0); mGLES2ShaderInit(&context->interframeShader, 0, _interframeFragmentShader, -1, -1, false, 0, 0);
#ifdef BUILD_GLES3
if (context->initialShader.vao != (GLuint) -1) { if (context->initialShader.vao != (GLuint) -1) {
glBindVertexArray(context->initialShader.vao); glBindVertexArray(context->initialShader.vao);
glBindBuffer(GL_ARRAY_BUFFER, context->vbo); glBindBuffer(GL_ARRAY_BUFFER, context->vbo);
@ -168,6 +169,7 @@ static void mGLES2ContextInit(struct VideoBackend* v, WHandle handle) {
glBindBuffer(GL_ARRAY_BUFFER, context->vbo); glBindBuffer(GL_ARRAY_BUFFER, context->vbo);
glBindVertexArray(0); glBindVertexArray(0);
} }
#endif
glDeleteFramebuffers(1, &context->finalShader.fbo); glDeleteFramebuffers(1, &context->finalShader.fbo);
glDeleteTextures(1, &context->finalShader.tex); glDeleteTextures(1, &context->finalShader.tex);
@ -297,9 +299,12 @@ void _drawShader(struct mGLES2Context* context, struct mGLES2Shader* shader) {
glUseProgram(shader->program); glUseProgram(shader->program);
glUniform1i(shader->texLocation, 0); glUniform1i(shader->texLocation, 0);
glUniform2f(shader->texSizeLocation, context->d.width - padW, context->d.height - padH); glUniform2f(shader->texSizeLocation, context->d.width - padW, context->d.height - padH);
#ifdef BUILD_GLES3
if (shader->vao != (GLuint) -1) { if (shader->vao != (GLuint) -1) {
glBindVertexArray(shader->vao); glBindVertexArray(shader->vao);
} else { } else
#endif
{
glBindBuffer(GL_ARRAY_BUFFER, context->vbo); glBindBuffer(GL_ARRAY_BUFFER, context->vbo);
glEnableVertexAttribArray(shader->positionLocation); glEnableVertexAttribArray(shader->positionLocation);
glVertexAttribPointer(shader->positionLocation, 2, GL_FLOAT, GL_FALSE, 0, NULL); glVertexAttribPointer(shader->positionLocation, 2, GL_FLOAT, GL_FALSE, 0, NULL);
@ -391,9 +396,11 @@ void mGLES2ContextDrawFrame(struct VideoBackend* v) {
} }
glBindFramebuffer(GL_FRAMEBUFFER, 0); glBindFramebuffer(GL_FRAMEBUFFER, 0);
glUseProgram(0); glUseProgram(0);
#ifdef BUILD_GLES3
if (context->finalShader.vao != (GLuint) -1) { if (context->finalShader.vao != (GLuint) -1) {
glBindVertexArray(0); glBindVertexArray(0);
} }
#endif
} }
void mGLES2ContextPostFrame(struct VideoBackend* v, const void* frame) { void mGLES2ContextPostFrame(struct VideoBackend* v, const void* frame) {
@ -508,6 +515,7 @@ void mGLES2ShaderInit(struct mGLES2Shader* shader, const char* vs, const char* f
shader->uniforms[i].location = glGetUniformLocation(shader->program, shader->uniforms[i].name); shader->uniforms[i].location = glGetUniformLocation(shader->program, shader->uniforms[i].name);
} }
#ifdef BUILD_GLES3
const GLubyte* extensions = glGetString(GL_EXTENSIONS); const GLubyte* extensions = glGetString(GL_EXTENSIONS);
if (shaderBuffer[0] == _gles2Header || version[0] >= '3' || (extensions && strstr((const char*) extensions, "_vertex_array_object") != NULL)) { if (shaderBuffer[0] == _gles2Header || version[0] >= '3' || (extensions && strstr((const char*) extensions, "_vertex_array_object") != NULL)) {
glGenVertexArrays(1, &shader->vao); glGenVertexArrays(1, &shader->vao);
@ -515,7 +523,9 @@ void mGLES2ShaderInit(struct mGLES2Shader* shader, const char* vs, const char* f
glEnableVertexAttribArray(shader->positionLocation); glEnableVertexAttribArray(shader->positionLocation);
glVertexAttribPointer(shader->positionLocation, 2, GL_FLOAT, GL_FALSE, 0, NULL); glVertexAttribPointer(shader->positionLocation, 2, GL_FLOAT, GL_FALSE, 0, NULL);
glBindVertexArray(0); glBindVertexArray(0);
} else { } else
#endif
{
shader->vao = -1; shader->vao = -1;
} }
@ -527,9 +537,11 @@ void mGLES2ShaderDeinit(struct mGLES2Shader* shader) {
glDeleteShader(shader->fragmentShader); glDeleteShader(shader->fragmentShader);
glDeleteProgram(shader->program); glDeleteProgram(shader->program);
glDeleteFramebuffers(1, &shader->fbo); glDeleteFramebuffers(1, &shader->fbo);
#ifdef BUILD_GLES3
if (shader->vao != (GLuint) -1) { if (shader->vao != (GLuint) -1) {
glDeleteVertexArrays(1, &shader->vao); glDeleteVertexArrays(1, &shader->vao);
} }
#endif
} }
void mGLES2ShaderAttach(struct mGLES2Context* context, struct mGLES2Shader* shaders, size_t nShaders) { void mGLES2ShaderAttach(struct mGLES2Context* context, struct mGLES2Shader* shaders, size_t nShaders) {
@ -547,16 +559,20 @@ void mGLES2ShaderAttach(struct mGLES2Context* context, struct mGLES2Shader* shad
glClearColor(0.f, 0.f, 0.f, 1.f); glClearColor(0.f, 0.f, 0.f, 1.f);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
#ifdef BUILD_GLES3
if (context->shaders[i].vao != (GLuint) -1) { if (context->shaders[i].vao != (GLuint) -1) {
glBindVertexArray(context->shaders[i].vao); glBindVertexArray(context->shaders[i].vao);
glBindBuffer(GL_ARRAY_BUFFER, context->vbo); glBindBuffer(GL_ARRAY_BUFFER, context->vbo);
glEnableVertexAttribArray(context->shaders[i].positionLocation); glEnableVertexAttribArray(context->shaders[i].positionLocation);
glVertexAttribPointer(context->shaders[i].positionLocation, 2, GL_FLOAT, GL_FALSE, 0, NULL); glVertexAttribPointer(context->shaders[i].positionLocation, 2, GL_FLOAT, GL_FALSE, 0, NULL);
} }
#endif
} }
#ifdef BUILD_GLES3
if (context->initialShader.vao != (GLuint) -1) { if (context->initialShader.vao != (GLuint) -1) {
glBindVertexArray(0); glBindVertexArray(0);
} }
#endif
glBindFramebuffer(GL_FRAMEBUFFER, 0); glBindFramebuffer(GL_FRAMEBUFFER, 0);
} }

View File

@ -20,6 +20,8 @@ CXX_GUARD_START
#include <GL/gl.h> #include <GL/gl.h>
#include <GL/glext.h> #include <GL/glext.h>
#endif #endif
#elif defined(BUILD_GLES3)
#include <GLES3/gl3.h>
#else #else
#include <GLES2/gl2.h> #include <GLES2/gl2.h>
#endif #endif