mirror of https://github.com/sm64pc/sm64pc.git
Migrated from GLES 2 to OpenGL 4.2 on switch
This commit is contained in:
parent
4ed2e05870
commit
bd20d16d07
4
Makefile
4
Makefile
|
@ -150,7 +150,7 @@ ifeq ($(TARGET_RPI),1) # Define RPi to change SDL2 title & GLES2 hints
|
|||
endif
|
||||
|
||||
ifeq ($(TARGET_SWITCH),1)
|
||||
VERSION_CFLAGS += -DUSE_GLES -DTARGET_SWITCH -DLUA_USE_LINUX
|
||||
VERSION_CFLAGS += -DTARGET_SWITCH -DLUA_USE_LINUX
|
||||
endif
|
||||
ifeq ($(OSX_BUILD),1) # Modify GFX & SDL2 for OSX GL
|
||||
VERSION_CFLAGS += -DOSX_BUILD
|
||||
|
@ -549,7 +549,7 @@ else ifeq ($(WINDOW_API),SDL2)
|
|||
ifeq ($(WINDOWS_BUILD),1)
|
||||
BACKEND_LDFLAGS += -lglew32 -lglu32 -lopengl32
|
||||
else ifneq ($(TARGET_RPI)$(TARGET_SWITCH),00)
|
||||
BACKEND_LDFLAGS += -lGLESv2
|
||||
BACKEND_LDFLAGS += -lglad -lglapi -ldrm_nouveau -lm
|
||||
else ifeq ($(OSX_BUILD),1)
|
||||
BACKEND_LDFLAGS += -framework OpenGL $(shell pkg-config --libs glew)
|
||||
else
|
||||
|
|
|
@ -22,12 +22,26 @@
|
|||
# include <GL/glew.h>
|
||||
#endif
|
||||
|
||||
#ifdef TARGET_SWITCH
|
||||
#include "glad/glad.h"
|
||||
#else
|
||||
#define GL_GLEXT_PROTOTYPES 1
|
||||
#ifdef USE_GLES
|
||||
# include <SDL2/SDL_opengles2.h>
|
||||
#else
|
||||
# include <SDL2/SDL_opengl.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if FOR_WINDOWS
|
||||
#define PLATFORM "Windows"
|
||||
#elif defined(OSX_BUILD)
|
||||
#define PLATFORM "MacOS"
|
||||
#elif defined(TARGET_SWITCH)
|
||||
#define PLATFORM "Nintendo Switch"
|
||||
#else
|
||||
#define PLATFORM "Linux"
|
||||
#endif
|
||||
|
||||
extern "C" {
|
||||
#include "pc/gfx/gfx_pc.h"
|
||||
|
@ -90,6 +104,7 @@ namespace MoonInternal {
|
|||
ImGui::PushStyleColor(ImGuiCol_Border, ImVec4(0, 0, 0, 0));
|
||||
ImGui::Begin("Moon64 Game Stats", NULL, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoResize);
|
||||
ImGui::Text("Framerate: %.3f ms/frame (%.1f FPS)", 1000.0f / ImGui::GetIO().Framerate, ImGui::GetIO().Framerate);
|
||||
ImGui::Text("Platform: " PLATFORM);
|
||||
ImGui::Text("Branch: " GIT_BRANCH);
|
||||
ImGui::Text("Commit: " GIT_HASH);
|
||||
ImGui::End();
|
||||
|
|
|
@ -101,12 +101,16 @@
|
|||
# include <GL/glew.h>
|
||||
#endif
|
||||
|
||||
#ifdef TARGET_SWITCH
|
||||
#include "glad/glad.h"
|
||||
#else
|
||||
#define GL_GLEXT_PROTOTYPES 1
|
||||
#ifdef USE_GLES
|
||||
# include <SDL2/SDL_opengles2.h>
|
||||
#else
|
||||
# include <SDL2/SDL_opengl.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
// Desktop GL 3.2+ has glDrawElementsBaseVertex() which GL ES and WebGL don't have.
|
||||
|
|
|
@ -66,7 +66,7 @@ IMGUI_IMPL_API void ImGui_ImplOpenGL3_DestroyDeviceObjects();
|
|||
// Otherwise try to detect supported Desktop OpenGL loaders..
|
||||
#elif defined(__has_include)
|
||||
#if __has_include(<GL/glew.h>)
|
||||
#define IMGUI_IMPL_OPENGL_LOADER_GLEW
|
||||
#define IMGUI_IMPL_OPENGL_LOADER_GLAD2
|
||||
#elif __has_include(<glad/glad.h>)
|
||||
#define IMGUI_IMPL_OPENGL_LOADER_GLAD
|
||||
#elif __has_include(<glad/gl.h>)
|
||||
|
|
|
@ -21,12 +21,16 @@
|
|||
|
||||
#include <SDL2/SDL.h>
|
||||
|
||||
#ifdef TARGET_SWITCH
|
||||
#include "glad/glad.h"
|
||||
#else
|
||||
#define GL_GLEXT_PROTOTYPES 1
|
||||
#ifdef USE_GLES
|
||||
# include <SDL2/SDL_opengles2.h>
|
||||
#else
|
||||
# include <SDL2/SDL_opengl.h>
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include "../platform.h"
|
||||
#include "../configfile.h"
|
||||
|
@ -399,27 +403,32 @@ static struct ShaderProgram *gfx_opengl_create_and_load_new_shader(uint32_t shad
|
|||
glCompileShader(vertex_shader);
|
||||
glGetShaderiv(vertex_shader, GL_COMPILE_STATUS, &success);
|
||||
if (!success) {
|
||||
GLint max_length = 0;
|
||||
glGetShaderiv(vertex_shader, GL_INFO_LOG_LENGTH, &max_length);
|
||||
char error_log[1024];
|
||||
fprintf(stderr, "Vertex shader compilation failed\n");
|
||||
glGetShaderInfoLog(vertex_shader, max_length, &max_length, &error_log[0]);
|
||||
fprintf(stderr, "%s\n", &error_log[0]);
|
||||
sys_fatal("vertex shader compilation failed (see terminal)");
|
||||
int length;
|
||||
glGetShaderiv(vertex_shader, GL_INFO_LOG_LENGTH, &length);
|
||||
char* message = (char*)malloc(length);
|
||||
glGetShaderInfoLog(vertex_shader, length, NULL, message);
|
||||
|
||||
printf("[Moon64] Failed to compile vertex shader:\n%s\n", message);
|
||||
free(message);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
GLuint fragment_shader = glCreateShader(GL_FRAGMENT_SHADER);
|
||||
glShaderSource(fragment_shader, 1, &sources[1], &lengths[1]);
|
||||
glCompileShader(fragment_shader);
|
||||
glGetShaderiv(fragment_shader, GL_COMPILE_STATUS, &success);
|
||||
|
||||
if (!success) {
|
||||
GLint max_length = 0;
|
||||
glGetShaderiv(fragment_shader, GL_INFO_LOG_LENGTH, &max_length);
|
||||
char error_log[1024];
|
||||
fprintf(stderr, "Fragment shader compilation failed\n");
|
||||
glGetShaderInfoLog(fragment_shader, max_length, &max_length, &error_log[0]);
|
||||
fprintf(stderr, "%s\n", &error_log[0]);
|
||||
sys_fatal("fragment shader compilation failed (see terminal)");
|
||||
int length;
|
||||
glGetShaderiv(fragment_shader, GL_INFO_LOG_LENGTH, &length);
|
||||
char* message = (char*)malloc(length);
|
||||
glGetShaderInfoLog(fragment_shader, length, NULL, message);
|
||||
|
||||
printf("[Moon64] Failed to compile fragment shader:\n%s\n", message);
|
||||
free(message);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
GLuint shader_program = glCreateProgram();
|
||||
|
@ -639,6 +648,7 @@ static void gfx_opengl_init(void) {
|
|||
moon_call_hook(0);
|
||||
}
|
||||
|
||||
|
||||
static void gfx_opengl_on_resize(void) {
|
||||
moon_bind_hook(GFX_ON_REZISE);
|
||||
moon_init_hook(0);
|
||||
|
@ -660,11 +670,12 @@ static void gfx_opengl_start_frame(void) {
|
|||
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
glEnable(GL_SCISSOR_TEST);
|
||||
#ifndef USE_GLES
|
||||
if(configWindow.enable_antialias)
|
||||
glEnable(GL_MULTISAMPLE);
|
||||
else
|
||||
glDisable(GL_MULTISAMPLE);
|
||||
|
||||
#endif
|
||||
moon_bind_hook(GFX_POST_START_FRAME);
|
||||
moon_init_hook(0);
|
||||
moon_call_hook(0);
|
||||
|
@ -689,6 +700,7 @@ static void gfx_opengl_shutdown(void) {
|
|||
moon_call_hook(0);
|
||||
}
|
||||
|
||||
|
||||
struct GfxRenderingAPI gfx_opengl_api = {
|
||||
gfx_opengl_z_is_from_0_to_1,
|
||||
gfx_opengl_unload_shader,
|
||||
|
|
|
@ -41,6 +41,7 @@
|
|||
// can't include <switch.h> or even <switch/services/applet.h> because
|
||||
// the basic libnx types have the same names as some of the types in this
|
||||
extern int appletGetOperationMode(void);
|
||||
#include "glad/glad.h"
|
||||
#endif
|
||||
|
||||
// TODO: figure out if this shit even works
|
||||
|
@ -213,18 +214,24 @@ static void gfx_sdl_init(const char *window_title) {
|
|||
|
||||
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
|
||||
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
|
||||
// SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
|
||||
SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);
|
||||
|
||||
#ifdef USE_GLES
|
||||
#ifdef TARGET_SWITCH
|
||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
|
||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
|
||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
|
||||
#endif
|
||||
|
||||
#ifdef USE_GLES
|
||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); // These attributes allow for hardware acceleration on RPis.
|
||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 0);
|
||||
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_ES);
|
||||
#endif
|
||||
|
||||
#elif !defined(TARGET_SWITCH)
|
||||
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
|
||||
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, configWindow.antialias_level);
|
||||
SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);
|
||||
#ifdef TARGET_SWITCH
|
||||
#endif
|
||||
|
||||
#ifdef TARGET_SWITCH
|
||||
configWindow.fullscreen = false;
|
||||
if (appletGetOperationMode() == 1) {
|
||||
configWindow.w = 1920;
|
||||
|
@ -235,18 +242,28 @@ static void gfx_sdl_init(const char *window_title) {
|
|||
}
|
||||
int xpos = 0;
|
||||
int ypos = 0;
|
||||
#else
|
||||
#else
|
||||
int xpos = (configWindow.x == WAPI_WIN_CENTERPOS) ? SDL_WINDOWPOS_CENTERED : configWindow.x;
|
||||
int ypos = (configWindow.y == WAPI_WIN_CENTERPOS) ? SDL_WINDOWPOS_CENTERED : configWindow.y;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
wnd = SDL_CreateWindow(
|
||||
window_title,
|
||||
SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, configWindow.w, configWindow.h,
|
||||
SDL_WINDOW_OPENGL | SDL_WINDOW_HIDDEN | SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI
|
||||
);
|
||||
if (wnd == NULL) {
|
||||
printf("Failed to initialize window\n");
|
||||
}
|
||||
|
||||
ctx = SDL_GL_CreateContext(wnd);
|
||||
|
||||
#ifdef TARGET_SWITCH
|
||||
if(!gladLoadGLLoader(SDL_GL_GetProcAddress)){
|
||||
printf("Failed to initialize glad\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
moon_bind_hook(WINDOW_API_INIT);
|
||||
moon_init_hook(2,
|
||||
(struct HookParameter){
|
||||
|
|
Loading…
Reference in New Issue