diff --git a/cores/libretro-test-gl-ff/Makefile b/cores/libretro-test-gl-ff/Makefile new file mode 100644 index 0000000000..645283c556 --- /dev/null +++ b/cores/libretro-test-gl-ff/Makefile @@ -0,0 +1,172 @@ +ifeq ($(platform),) + platform = unix + ifeq ($(shell uname -a),) + platform = win + else ifneq ($(findstring MINGW,$(shell uname -a)),) + platform = win + else ifneq ($(findstring Darwin,$(shell uname -a)),) + platform = osx + arch = intel + ifeq ($(shell uname -p),powerpc) + arch = ppc + endif + else ifneq ($(findstring win,$(shell uname -a)),) + platform = win + endif +endif + +# system platform +system_platform = unix +ifeq ($(shell uname -a),) + EXE_EXT = .exe + system_platform = win +else ifneq ($(findstring Darwin,$(shell uname -a)),) + system_platform = osx + arch = intel + ifeq ($(shell uname -p),powerpc) + arch = ppc + endif + else ifneq ($(findstring MINGW,$(shell uname -a)),) + system_platform = win +endif + +TARGET_NAME = testgl_ff + +ifeq ($(platform), unix) + TARGET := $(TARGET_NAME)_libretro.so + fpic := -fPIC + SHARED := -shared -Wl,--version-script=link.T -Wl,--no-undefined + GL_LIB := -lGL +else ifneq (,$(findstring osx,$(platform))) + TARGET := $(TARGET_NAME)_libretro.dylib + fpic := -fPIC + SHARED := -dynamiclib + GL_LIB := -framework OpenGL + CFLAGS += -DOSX + ifeq ($(arch),ppc) + CFLAGS += -D__ppc__ -DOSX_PPC + endif + OSXVER = `sw_vers -productVersion | cut -d. -f 2` + OSX_LT_MAVERICKS = `(( $(OSXVER) <= 9)) && echo "YES"` + fpic += -mmacosx-version-min=10.1 +else ifeq ($(platform), pi) + TARGET := $(TARGET_NAME)_libretro.so + fpic := -fPIC + SHARED := -shared -Wl,--version-script=link.T -Wl,--no-undefined + CFLAGS += -I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads -I/opt/vc/include/vmcs_host/linux + GLES := 1 + LIBS += -L/opt/vc/lib +else ifneq (,$(findstring ios,$(platform))) + TARGET := $(TARGET_NAME)_libretro_ios.dylib + fpic := -fPIC + SHARED := -dynamiclib + +ifeq ($(IOSSDK),) + IOSSDK := $(shell xcodebuild -version -sdk iphoneos Path) +endif + + GL_LIB := -framework OpenGLES + DEFINES := -DIOS + CFLAGS += -DGLES $(DEFINES) + CC = cc -arch armv7 -isysroot $(IOSSDK) +ifeq ($(platform),ios9) + CC += -miphoneos-version-min=8.0 + CFLAGS += -miphoneos-version-min=8.0 +else + CC += -miphoneos-version-min=5.0 + CFLAGS += -miphoneos-version-min=5.0 +endif +else ifneq (,$(findstring qnx,$(platform))) + TARGET := $(TARGET_NAME)_libretro_qnx.so + fpic := -fPIC + SHARED := -shared -Wl,--version-script=link.T + GL_LIB := -lGL + + CC = qcc -Vgcc_ntoarmv7le + AR = qcc -Vgcc_ntoarmv7le + CFLAGS += -DGLES + GL_LIB := -lGLESv2 + GLES := 1 +else ifneq (,$(findstring armv,$(platform))) + CC = gcc + TARGET := $(TARGET_NAME)_libretro.so + fpic := -fPIC + SHARED := -shared -Wl,--version-script=link.T -Wl,--no-undefined + CFLAGS += -I. +ifneq (,$(findstring gles,$(platform))) + GLES := 1 +else + GL_LIB := -lGL +endif +ifneq (,$(findstring cortexa8,$(platform))) + CFLAGS += -marm -mcpu=cortex-a8 +else ifneq (,$(findstring cortexa9,$(platform))) + CFLAGS += -marm -mcpu=cortex-a9 +endif + CFLAGS += -marm +ifneq (,$(findstring neon,$(platform))) + CFLAGS += -mfpu=neon +endif +ifneq (,$(findstring softfloat,$(platform))) + CFLAGS += -mfloat-abi=softfp +else ifneq (,$(findstring hardfloat,$(platform))) + CFLAGS += -mfloat-abi=hard +endif + CFLAGS += -DARM +# emscripten +else ifeq ($(platform), emscripten) + TARGET := $(TARGET_NAME)_libretro_emscripten.bc +else + CC = gcc + TARGET := $(TARGET_NAME)_libretro.dll + SHARED := -shared -static-libgcc -static-libstdc++ -s -Wl,--version-script=link.T -Wl,--no-undefined + GL_LIB := -lopengl32 + CFLAGS += -I.. +endif + +ifeq ($(DEBUG), 1) + CFLAGS += -O0 -g +else + CFLAGS += -O3 +endif + +ifneq (,$(findstring qnx,$(platform))) + CFLAGS += -Wc,-std=c99 +else + CFLAGS += -std=gnu99 +endif + +OBJECTS := libretro_gl_ff_test.o ../../libretro-common/glsym/rglgen.o +CFLAGS += -Wall -pedantic $(fpic) + +ifeq ($(GLES), 1) + CFLAGS += -DGLES -DHAVE_OPENGLES2 + ifeq ($(GLES31), 1) + CFLAGS += -DHAVE_OPENGLES3 -DGLES31 -DGLES3 + else ifeq ($(GLES3), 1) + CFLAGS += -DHAVE_OPENGLES3 -DGLES3 + endif + LIBS += -lGLESv2 # Still link against GLESv2 when using GLES3 API, at least on desktop Linux. + OBJECTS += ../../libretro-common/glsym/glsym_es2.o +else + OBJECTS += ../../libretro-common/glsym/glsym_gl.o + LIBS += $(GL_LIB) +endif + +ifeq ($(CORE), 1) + CFLAGS += -DCORE +endif + +all: $(TARGET) + +$(TARGET): $(OBJECTS) + $(CC) $(fpic) $(SHARED) $(INCLUDES) -o $@ $(OBJECTS) $(LIBS) -lm $(EXTRA_GL_LIBS) + +%.o: %.c + $(CC) -I../../libretro-common/include $(CFLAGS) -c -o $@ $< + +clean: + rm -f $(OBJECTS) $(TARGET) + +.PHONY: clean + diff --git a/cores/libretro-test-gl-ff/jni/Android.mk b/cores/libretro-test-gl-ff/jni/Android.mk new file mode 100644 index 0000000000..2886ee2c39 --- /dev/null +++ b/cores/libretro-test-gl-ff/jni/Android.mk @@ -0,0 +1,27 @@ +LOCAL_PATH := $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_MODULE := retro-test-gl-ff + +ifeq ($(TARGET_ARCH),arm) +LOCAL_CFLAGS += -DANDROID_ARM +LOCAL_ARM_MODE := arm +endif + +ifeq ($(TARGET_ARCH),x86) +LOCAL_CFLAGS += -DANDROID_X86 +endif + +ifeq ($(TARGET_ARCH),mips) +LOCAL_CFLAGS += -DANDROID_MIPS +endif + +GLES_LIB := -lGLESv2 + +LOCAL_SRC_FILES += $(addprefix ../,$(wildcard *.c) ../../../libretro-common/glsym/rglgen.c ../../../libretro-common/glsym/glsym_es2.c) +LOCAL_CFLAGS += -O2 -Wall -std=gnu99 -ffast-math -DGLES -DHAVE_OPENGLES2 -I../../../libretro-common/include +LOCAL_LDLIBS += $(GLES_LIB) + +include $(BUILD_SHARED_LIBRARY) + diff --git a/cores/libretro-test-gl-ff/jni/Application.mk b/cores/libretro-test-gl-ff/jni/Application.mk new file mode 100644 index 0000000000..a6c92889cc --- /dev/null +++ b/cores/libretro-test-gl-ff/jni/Application.mk @@ -0,0 +1,7 @@ +APP_ABI := all +ifeq ($(GLES), 3) + APP_PLATFORM := android-18 +else + APP_PLATFORM := android-9 +endif + diff --git a/cores/libretro-test-gl-ff/libretro_gl_ff_test.c b/cores/libretro-test-gl-ff/libretro_gl_ff_test.c new file mode 100644 index 0000000000..f9e6d4ce6d --- /dev/null +++ b/cores/libretro-test-gl-ff/libretro_gl_ff_test.c @@ -0,0 +1,366 @@ +#include +#include +#include +#include +#include + +#include + +#include "../../libretro.h" + +#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) +static struct retro_hw_render_callback hw_render; + +#if defined(HAVE_PSGL) +#define RARCH_GL_FRAMEBUFFER GL_FRAMEBUFFER_OES +#define RARCH_GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE_OES +#define RARCH_GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_EXT +#elif defined(OSX_PPC) +#define RARCH_GL_FRAMEBUFFER GL_FRAMEBUFFER_EXT +#define RARCH_GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE_EXT +#define RARCH_GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_EXT +#else +#define RARCH_GL_FRAMEBUFFER GL_FRAMEBUFFER +#define RARCH_GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE +#define RARCH_GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0 +#endif + +#define BASE_WIDTH 320 +#define BASE_HEIGHT 240 +#ifdef GLES +#define MAX_WIDTH 1024 +#define MAX_HEIGHT 1024 +#else +#define MAX_WIDTH 2048 +#define MAX_HEIGHT 2048 +#endif + +static unsigned width = BASE_WIDTH; +static unsigned height = BASE_HEIGHT; + +void retro_init(void) +{} + +void retro_deinit(void) +{} + +unsigned retro_api_version(void) +{ + return RETRO_API_VERSION; +} + +void retro_set_controller_port_device(unsigned port, unsigned device) +{ + (void)port; + (void)device; +} + +void retro_get_system_info(struct retro_system_info *info) +{ + memset(info, 0, sizeof(*info)); + info->library_name = "TestCore GL (FF)"; + info->library_version = "v1"; + info->need_fullpath = false; + info->valid_extensions = NULL; // Anything is fine, we don't care. +} + +void retro_get_system_av_info(struct retro_system_av_info *info) +{ + info->timing = (struct retro_system_timing) { + .fps = 60.0, + .sample_rate = 30000.0, + }; + + info->geometry = (struct retro_game_geometry) { + .base_width = BASE_WIDTH, + .base_height = BASE_HEIGHT, + .max_width = MAX_WIDTH, + .max_height = MAX_HEIGHT, + .aspect_ratio = 4.0 / 3.0, + }; +} + +static retro_video_refresh_t video_cb; +static retro_audio_sample_t audio_cb; +static retro_audio_sample_batch_t audio_batch_cb; +static retro_environment_t environ_cb; +static retro_input_poll_t input_poll_cb; +static retro_input_state_t input_state_cb; + +void retro_set_environment(retro_environment_t cb) +{ + environ_cb = cb; + + struct retro_variable variables[] = { + { + "testgl_resolution", +#ifdef GLES + "Internal resolution; 320x240|360x480|480x272|512x384|512x512|640x240|640x448|640x480|720x576|800x600|960x720|1024x768", +#else + "Internal resolution; 320x240|360x480|480x272|512x384|512x512|640x240|640x448|640x480|720x576|800x600|960x720|1024x768|1024x1024|1280x720|1280x960|1600x1200|1920x1080|1920x1440|1920x1600|2048x2048", +#endif + }, +#ifdef CORE + { "testgl_multisample", "Multisampling; 1x|2x|4x" }, +#endif + { NULL, NULL }, + }; + + bool no_rom = true; + cb(RETRO_ENVIRONMENT_SET_SUPPORT_NO_GAME, &no_rom); + cb(RETRO_ENVIRONMENT_SET_VARIABLES, variables); +} + +void retro_set_audio_sample(retro_audio_sample_t cb) +{ + audio_cb = cb; +} + +void retro_set_audio_sample_batch(retro_audio_sample_batch_t cb) +{ + audio_batch_cb = cb; +} + +void retro_set_input_poll(retro_input_poll_t cb) +{ + input_poll_cb = cb; +} + +void retro_set_input_state(retro_input_state_t cb) +{ + input_state_cb = cb; +} + +void retro_set_video_refresh(retro_video_refresh_t cb) +{ + video_cb = cb; +} + +static void update_variables(void) +{ + struct retro_variable var = { + .key = "testgl_resolution", + }; + + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) + { + char *pch; + char str[100]; + snprintf(str, sizeof(str), "%s", var.value); + + pch = strtok(str, "x"); + if (pch) + width = strtoul(pch, NULL, 0); + pch = strtok(NULL, "x"); + if (pch) + height = strtoul(pch, NULL, 0); + + fprintf(stderr, "[libretro-test]: Got size: %u x %u.\n", width, height); + } + +#ifdef CORE + var.key = "testgl_multisample"; + var.value = NULL; + + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) + { + switch (*var.value) + { + case '1': + init_multisample(1); + break; + + case '2': + init_multisample(2); + break; + + case '4': + init_multisample(4); + break; + } + } +#endif +} + +static unsigned frame_count; + +void retro_run(void) +{ + bool updated = false; + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && updated) + update_variables(); + + input_poll_cb(); + + if (input_state_cb(0, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_UP)) + { + } + + float ratio = width / (float)height; + + glBindFramebuffer(RARCH_GL_FRAMEBUFFER, hw_render.get_current_framebuffer()); + + glClearColor(0.3, 0.4, 0.5, 1.0); + glViewport(0, 0, width, height); + glClear(GL_COLOR_BUFFER_BIT); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(-ratio, ratio, -1.f, 1.f, 1.f, -1.f); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glRotatef((float)frame_count * 2, 0.0f, 0.0f, 0.1f); + + glLoadIdentity(); + glBegin(GL_TRIANGLES); + + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + glVertex2f(-0.5f, -0.5f); + + glColor4f(1.0f, 1.0f, 0.0f, 1.0f); + glVertex2f(0.5f, -0.5f); + + glColor4f(0.0f, 1.0f, 1.0f, 1.0f); + glVertex2f(-0.5f, 0.5f); + + glColor4f(1.0f, 0.0f, 1.0f, 1.0f); + glVertex2f(0.5f, 0.5f); + + glEnd(); + + frame_count++; + + video_cb(RETRO_HW_FRAME_BUFFER_VALID, width, height, 0); +} + +static void context_reset(void) +{ + fprintf(stderr, "Context reset!\n"); + rglgen_resolve_symbols(hw_render.get_proc_address); +} + +static void context_destroy(void) +{ + fprintf(stderr, "Context destroy!\n"); +} + +#ifdef GLES +static bool retro_init_hw_context(void) +{ +#if defined(GLES31) + hw_render.context_type = RETRO_HW_CONTEXT_OPENGLES_VERSION; + hw_render.version_major = 3; + hw_render.version_minor = 1; +#elif defined(GLES3) + hw_render.context_type = RETRO_HW_CONTEXT_OPENGLES3; +#else + hw_render.context_type = RETRO_HW_CONTEXT_OPENGLES2; +#endif + hw_render.context_reset = context_reset; + hw_render.context_destroy = context_destroy; + hw_render.depth = true; + hw_render.bottom_left_origin = true; + + if (!environ_cb(RETRO_ENVIRONMENT_SET_HW_RENDER, &hw_render)) + return false; + + return true; +} +#else +static bool retro_init_hw_context(void) +{ + hw_render.context_type = RETRO_HW_CONTEXT_OPENGL; + hw_render.context_reset = context_reset; + hw_render.context_destroy = context_destroy; + hw_render.depth = true; + hw_render.bottom_left_origin = true; + + if (!environ_cb(RETRO_ENVIRONMENT_SET_HW_RENDER, &hw_render)) + return false; + + return true; +} +#endif + +bool retro_load_game(const struct retro_game_info *info) +{ + update_variables(); + + enum retro_pixel_format fmt = RETRO_PIXEL_FORMAT_XRGB8888; + if (!environ_cb(RETRO_ENVIRONMENT_SET_PIXEL_FORMAT, &fmt)) + { + fprintf(stderr, "XRGB8888 is not supported.\n"); + return false; + } + + if (!retro_init_hw_context()) + { + fprintf(stderr, "HW Context could not be initialized, exiting...\n"); + return false; + } + + fprintf(stderr, "Loaded game!\n"); + (void)info; + return true; +} + +void retro_unload_game(void) +{} + +unsigned retro_get_region(void) +{ + return RETRO_REGION_NTSC; +} + +bool retro_load_game_special(unsigned type, const struct retro_game_info *info, size_t num) +{ + (void)type; + (void)info; + (void)num; + return false; +} + +size_t retro_serialize_size(void) +{ + return 0; +} + +bool retro_serialize(void *data, size_t size) +{ + (void)data; + (void)size; + return false; +} + +bool retro_unserialize(const void *data, size_t size) +{ + (void)data; + (void)size; + return false; +} + +void *retro_get_memory_data(unsigned id) +{ + (void)id; + return NULL; +} + +size_t retro_get_memory_size(unsigned id) +{ + (void)id; + return 0; +} + +void retro_reset(void) +{} + +void retro_cheat_reset(void) +{} + +void retro_cheat_set(unsigned index, bool enabled, const char *code) +{ + (void)index; + (void)enabled; + (void)code; +} + diff --git a/cores/libretro-test-gl-ff/link.T b/cores/libretro-test-gl-ff/link.T new file mode 100644 index 0000000000..b0c262db9e --- /dev/null +++ b/cores/libretro-test-gl-ff/link.T @@ -0,0 +1,5 @@ +{ + global: retro_*; + local: *; +}; + diff --git a/cores/libretro-test-gl/Makefile b/cores/libretro-test-gl/Makefile index ae4d5ccd93..83b45b80f3 100644 --- a/cores/libretro-test-gl/Makefile +++ b/cores/libretro-test-gl/Makefile @@ -136,7 +136,7 @@ else CFLAGS += -std=gnu99 endif -OBJECTS := libretro-test.o ../../libretro-common/glsym/rglgen.o +OBJECTS := libretro_gl_test.o ../../libretro-common/glsym/rglgen.o CFLAGS += -Wall -pedantic $(fpic) ifeq ($(GLES), 1) diff --git a/cores/libretro-test-gl/libretro-test.c b/cores/libretro-test-gl/libretro_gl_test.c similarity index 92% rename from cores/libretro-test-gl/libretro-test.c rename to cores/libretro-test-gl/libretro_gl_test.c index 628a6fd1cf..139d87ae14 100644 --- a/cores/libretro-test-gl/libretro-test.c +++ b/cores/libretro-test-gl/libretro_gl_test.c @@ -8,10 +8,6 @@ #include "../../libretro.h" -#if 0 -#define GL_FF -#endif - #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) static struct retro_hw_render_callback hw_render; @@ -42,7 +38,6 @@ static struct retro_hw_render_callback hw_render; static unsigned width = BASE_WIDTH; static unsigned height = BASE_HEIGHT; -#ifndef GL_FF static GLuint prog; static GLuint vbo; @@ -97,10 +92,7 @@ static const char *fragment_shader[] = { "}", }; #endif -#endif - -#ifndef GL_FF static void compile_program(void) { prog = glCreateProgram(); @@ -175,9 +167,7 @@ static void init_multisample(unsigned samples) fprintf(stderr, "Multisampled FBOs not supported.\n"); } #endif -#endif -#ifndef GL_FF static void setup_vao(void) { static const GLfloat vertex_data[] = { @@ -204,7 +194,6 @@ static void setup_vao(void) glBindBuffer(GL_ARRAY_BUFFER, 0); glUseProgram(0); } -#endif void retro_init(void) {} @@ -226,11 +215,7 @@ void retro_set_controller_port_device(unsigned port, unsigned device) void retro_get_system_info(struct retro_system_info *info) { memset(info, 0, sizeof(*info)); -#ifdef GL_FF - info->library_name = "TestCore GL (FF)"; -#else info->library_name = "TestCore GL"; -#endif info->library_version = "v1"; info->need_fullpath = false; info->valid_extensions = NULL; // Anything is fine, we don't care. @@ -368,39 +353,6 @@ void retro_run(void) { } -#ifdef GL_FF - float ratio = width / (float)height; - - glBindFramebuffer(RARCH_GL_FRAMEBUFFER, hw_render.get_current_framebuffer()); - - glClearColor(0.3, 0.4, 0.5, 1.0); - glViewport(0, 0, width, height); - glClear(GL_COLOR_BUFFER_BIT); - - glMatrixMode(GL_PROJECTION); - glLoadIdentity(); - glOrtho(-ratio, ratio, -1.f, 1.f, 1.f, -1.f); - glMatrixMode(GL_MODELVIEW); - glLoadIdentity(); - glRotatef((float)frame_count * 2, 0.0f, 0.0f, 0.1f); - - glLoadIdentity(); - glBegin(GL_TRIANGLES); - - glColor4f(1.0f, 1.0f, 1.0f, 1.0f); - glVertex2f(-0.5f, -0.5f); - - glColor4f(1.0f, 1.0f, 0.0f, 1.0f); - glVertex2f(0.5f, -0.5f); - - glColor4f(0.0f, 1.0f, 1.0f, 1.0f); - glVertex2f(-0.5f, 0.5f); - - glColor4f(1.0f, 0.0f, 1.0f, 1.0f); - glVertex2f(0.5f, 0.5f); - - glEnd(); -#else #ifdef CORE glBindVertexArray(vao); @@ -470,7 +422,6 @@ void retro_run(void) glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); } -#endif #endif frame_count++; @@ -483,21 +434,18 @@ static void context_reset(void) fprintf(stderr, "Context reset!\n"); rglgen_resolve_symbols(hw_render.get_proc_address); -#ifndef GL_FF compile_program(); setup_vao(); #ifdef CORE context_alive = true; init_multisample(multisample); #endif -#endif } static void context_destroy(void) { fprintf(stderr, "Context destroy!\n"); -#ifndef GL_FF #ifdef CORE glDeleteVertexArrays(1, &vao); vao = 0; @@ -508,7 +456,6 @@ static void context_destroy(void) vbo = 0; glDeleteProgram(prog); prog = 0; -#endif } #ifdef GLES @@ -526,9 +473,7 @@ static bool retro_init_hw_context(void) hw_render.context_reset = context_reset; hw_render.context_destroy = context_destroy; hw_render.depth = true; -#ifndef GL_FF hw_render.stencil = true; -#endif hw_render.bottom_left_origin = true; if (!environ_cb(RETRO_ENVIRONMENT_SET_HW_RENDER, &hw_render)) @@ -539,7 +484,7 @@ static bool retro_init_hw_context(void) #else static bool retro_init_hw_context(void) { -#if defined(CORE) && !defined(GL_FF) +#if defined(CORE) hw_render.context_type = RETRO_HW_CONTEXT_OPENGL_CORE; hw_render.version_major = 3; hw_render.version_minor = 1;