mirror of
https://github.com/libretro/RetroArch
synced 2025-02-27 18:41:01 +00:00
Create libretro GL FF Test
This commit is contained in:
parent
29ae063003
commit
c8d57e98d2
172
cores/libretro-test-gl-ff/Makefile
Normal file
172
cores/libretro-test-gl-ff/Makefile
Normal file
@ -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
|
||||||
|
|
27
cores/libretro-test-gl-ff/jni/Android.mk
Normal file
27
cores/libretro-test-gl-ff/jni/Android.mk
Normal file
@ -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)
|
||||||
|
|
7
cores/libretro-test-gl-ff/jni/Application.mk
Normal file
7
cores/libretro-test-gl-ff/jni/Application.mk
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
APP_ABI := all
|
||||||
|
ifeq ($(GLES), 3)
|
||||||
|
APP_PLATFORM := android-18
|
||||||
|
else
|
||||||
|
APP_PLATFORM := android-9
|
||||||
|
endif
|
||||||
|
|
366
cores/libretro-test-gl-ff/libretro_gl_ff_test.c
Normal file
366
cores/libretro-test-gl-ff/libretro_gl_ff_test.c
Normal file
@ -0,0 +1,366 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#include <glsym/glsym.h>
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
||||||
|
|
5
cores/libretro-test-gl-ff/link.T
Normal file
5
cores/libretro-test-gl-ff/link.T
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
global: retro_*;
|
||||||
|
local: *;
|
||||||
|
};
|
||||||
|
|
@ -136,7 +136,7 @@ else
|
|||||||
CFLAGS += -std=gnu99
|
CFLAGS += -std=gnu99
|
||||||
endif
|
endif
|
||||||
|
|
||||||
OBJECTS := libretro-test.o ../../libretro-common/glsym/rglgen.o
|
OBJECTS := libretro_gl_test.o ../../libretro-common/glsym/rglgen.o
|
||||||
CFLAGS += -Wall -pedantic $(fpic)
|
CFLAGS += -Wall -pedantic $(fpic)
|
||||||
|
|
||||||
ifeq ($(GLES), 1)
|
ifeq ($(GLES), 1)
|
||||||
|
@ -8,10 +8,6 @@
|
|||||||
|
|
||||||
#include "../../libretro.h"
|
#include "../../libretro.h"
|
||||||
|
|
||||||
#if 0
|
|
||||||
#define GL_FF
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
|
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
|
||||||
static struct retro_hw_render_callback hw_render;
|
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 width = BASE_WIDTH;
|
||||||
static unsigned height = BASE_HEIGHT;
|
static unsigned height = BASE_HEIGHT;
|
||||||
|
|
||||||
#ifndef GL_FF
|
|
||||||
static GLuint prog;
|
static GLuint prog;
|
||||||
static GLuint vbo;
|
static GLuint vbo;
|
||||||
|
|
||||||
@ -97,10 +92,7 @@ static const char *fragment_shader[] = {
|
|||||||
"}",
|
"}",
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef GL_FF
|
|
||||||
static void compile_program(void)
|
static void compile_program(void)
|
||||||
{
|
{
|
||||||
prog = glCreateProgram();
|
prog = glCreateProgram();
|
||||||
@ -175,9 +167,7 @@ static void init_multisample(unsigned samples)
|
|||||||
fprintf(stderr, "Multisampled FBOs not supported.\n");
|
fprintf(stderr, "Multisampled FBOs not supported.\n");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef GL_FF
|
|
||||||
static void setup_vao(void)
|
static void setup_vao(void)
|
||||||
{
|
{
|
||||||
static const GLfloat vertex_data[] = {
|
static const GLfloat vertex_data[] = {
|
||||||
@ -204,7 +194,6 @@ static void setup_vao(void)
|
|||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
glUseProgram(0);
|
glUseProgram(0);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
void retro_init(void)
|
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)
|
void retro_get_system_info(struct retro_system_info *info)
|
||||||
{
|
{
|
||||||
memset(info, 0, sizeof(*info));
|
memset(info, 0, sizeof(*info));
|
||||||
#ifdef GL_FF
|
|
||||||
info->library_name = "TestCore GL (FF)";
|
|
||||||
#else
|
|
||||||
info->library_name = "TestCore GL";
|
info->library_name = "TestCore GL";
|
||||||
#endif
|
|
||||||
info->library_version = "v1";
|
info->library_version = "v1";
|
||||||
info->need_fullpath = false;
|
info->need_fullpath = false;
|
||||||
info->valid_extensions = NULL; // Anything is fine, we don't care.
|
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
|
#ifdef CORE
|
||||||
glBindVertexArray(vao);
|
glBindVertexArray(vao);
|
||||||
@ -470,7 +422,6 @@ void retro_run(void)
|
|||||||
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
|
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
|
||||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
|
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
frame_count++;
|
frame_count++;
|
||||||
@ -483,21 +434,18 @@ static void context_reset(void)
|
|||||||
fprintf(stderr, "Context reset!\n");
|
fprintf(stderr, "Context reset!\n");
|
||||||
rglgen_resolve_symbols(hw_render.get_proc_address);
|
rglgen_resolve_symbols(hw_render.get_proc_address);
|
||||||
|
|
||||||
#ifndef GL_FF
|
|
||||||
compile_program();
|
compile_program();
|
||||||
setup_vao();
|
setup_vao();
|
||||||
#ifdef CORE
|
#ifdef CORE
|
||||||
context_alive = true;
|
context_alive = true;
|
||||||
init_multisample(multisample);
|
init_multisample(multisample);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void context_destroy(void)
|
static void context_destroy(void)
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Context destroy!\n");
|
fprintf(stderr, "Context destroy!\n");
|
||||||
|
|
||||||
#ifndef GL_FF
|
|
||||||
#ifdef CORE
|
#ifdef CORE
|
||||||
glDeleteVertexArrays(1, &vao);
|
glDeleteVertexArrays(1, &vao);
|
||||||
vao = 0;
|
vao = 0;
|
||||||
@ -508,7 +456,6 @@ static void context_destroy(void)
|
|||||||
vbo = 0;
|
vbo = 0;
|
||||||
glDeleteProgram(prog);
|
glDeleteProgram(prog);
|
||||||
prog = 0;
|
prog = 0;
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef GLES
|
#ifdef GLES
|
||||||
@ -526,9 +473,7 @@ static bool retro_init_hw_context(void)
|
|||||||
hw_render.context_reset = context_reset;
|
hw_render.context_reset = context_reset;
|
||||||
hw_render.context_destroy = context_destroy;
|
hw_render.context_destroy = context_destroy;
|
||||||
hw_render.depth = true;
|
hw_render.depth = true;
|
||||||
#ifndef GL_FF
|
|
||||||
hw_render.stencil = true;
|
hw_render.stencil = true;
|
||||||
#endif
|
|
||||||
hw_render.bottom_left_origin = true;
|
hw_render.bottom_left_origin = true;
|
||||||
|
|
||||||
if (!environ_cb(RETRO_ENVIRONMENT_SET_HW_RENDER, &hw_render))
|
if (!environ_cb(RETRO_ENVIRONMENT_SET_HW_RENDER, &hw_render))
|
||||||
@ -539,7 +484,7 @@ static bool retro_init_hw_context(void)
|
|||||||
#else
|
#else
|
||||||
static bool retro_init_hw_context(void)
|
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.context_type = RETRO_HW_CONTEXT_OPENGL_CORE;
|
||||||
hw_render.version_major = 3;
|
hw_render.version_major = 3;
|
||||||
hw_render.version_minor = 1;
|
hw_render.version_minor = 1;
|
Loading…
x
Reference in New Issue
Block a user