Compare commits

...

5 commits

Author SHA1 Message Date
rdanbrook dfad201a92 Update dependencies in README.md 2024-06-04 18:30:41 -06:00
rdanbrook 8cecf3db31 FLTK: Add drag and drop support 2024-06-04 17:37:53 -06:00
rdanbrook b826d3d080 FLTK: Detect supported GL versions and fall back to legacy when necessary 2024-06-03 23:25:32 -06:00
rdanbrook 39431dfc09 FLTK: Move OSD log messages further from the left 2024-06-03 18:32:37 -06:00
rdanbrook a5e85c480e FLTK: Actually add version.h to source control 2024-06-03 09:11:39 -06:00
6 changed files with 75 additions and 12 deletions

View file

@ -20,12 +20,12 @@ libretro community. For libretro-specific issues, please use the libretro reposi
https://github.com/libretro/nestopia
This project depends on the following libraries:
FLTK 1.3, SDL2, libarchive, libsamplerate, zlib
FLTK 1.3, SDL2, libarchive, libepoxy, libsamplerate, zlib
## Installing Dependencies
Install dependencies required for building on Debian-based Linux distributions:
```
apt-get install build-essential autoconf autoconf-archive automake autotools-dev libfltk1.3-dev libsamplerate0-dev libsdl2-dev libarchive-dev zlib1g-dev
apt-get install build-essential autoconf autoconf-archive automake autotools-dev libarchive-dev libepoxy-dev libfltk1.3-dev libsamplerate0-dev libsdl2-dev zlib1g-dev
```
## FLTK Build

View file

@ -25,6 +25,7 @@
#include <filesystem>
#include <fstream>
#include <iostream>
#include <regex>
#include <set>
#include <epoxy/gl.h>
@ -552,6 +553,23 @@ int NstGlArea::handle(int e) {
inputmgr->event(xc, yc);
inputmgr->event(Fl::event_button() + 1000, Fl::event_state() ? true : false);
break;
case FL_DND_ENTER: // return 1 for these events to accept Drag and Drop
case FL_DND_DRAG:
case FL_DND_RELEASE:
return 1;
case FL_PASTE: { // handle the actual drop event
std::string filepath{std::regex_replace(std::string(Fl::event_text()),
std::regex("\\n|file://"), "")};
FltkUi::load_file(filepath.c_str());
if (jgm->is_loaded()) {
FltkUi::enable_menu();
nstwin->label(jgm->get_gamename().c_str());
jg_setup_audio();
jg_setup_video();
inputmgr->reassign();
}
return 1;
}
}
return Fl_Gl_Window::handle(e);

View file

@ -28,7 +28,7 @@
void LogDriver::log(LogLevel level, std::string text) {
if (level == LogLevel::OSD) {
VideoRenderer::text_print(text.c_str(), 8, 212, 2, true);
VideoRenderer::text_print(text.c_str(), 16, 212, 2, true);
}
else if (level == LogLevel::Info) {
std::cout << text << std::endl;
@ -52,7 +52,7 @@ void LogDriver::jg_log(int level, const char *fmt, ...) {
FILE *fout = level == 1 ? stdout : stderr;
if (level == JG_LOG_SCR) {
VideoRenderer::text_print(buffer, 8, 212, 2, true);
VideoRenderer::text_print(buffer, 16, 212, 2, true);
return;
}
@ -60,6 +60,6 @@ void LogDriver::jg_log(int level, const char *fmt, ...) {
fflush(fout);
if (level == JG_LOG_ERR) {
VideoRenderer::text_print(buffer, 8, 212, 2, true);
VideoRenderer::text_print(buffer, 16, 212, 2, true);
}
}

13
source/fltkui/version.h Normal file
View file

@ -0,0 +1,13 @@
#if 0
# this file is valid C, Makefile and shell
# this is the only file required to update when changing the version
# https://semver.org/
VERSION_MAJOR=1
VERSION_MINOR=52
VERSION_PATCH=1
#endif
#ifndef JG_VERSION
#define JG_VERSION "1.52.1"
#endif

View file

@ -87,8 +87,8 @@ VideoRendererLegacy::~VideoRendererLegacy() {
}
}
VideoRendererModern::VideoRendererModern(SettingManager& setmgr)
: VideoRenderer(setmgr) {
VideoRendererModern::VideoRendererModern(SettingManager& setmgr, const std::string ver)
: VideoRenderer(setmgr), glslver(ver) {
// Create Vertex Array Objects
glGenVertexArrays(1, &vao[0]);
glGenVertexArrays(1, &vao[1]);
@ -281,9 +281,7 @@ const char* VideoRendererModern::shader_load(const char *filename) {
GLchar *shader = (GLchar*)calloc(size + 1, sizeof(GLchar));
// Write version string into the buffer for the full shader source
//snprintf(src, SIZE_GLSLVER, "%s", settings[VIDEO_API].val ?
// "#version 300 es\n" : "#version 330 core\n");
snprintf(src, SIZE_GLSLVER, "%s", "#version 330 core\n");
snprintf(src, SIZE_GLSLVER, "%s", glslver.c_str());
if (!shader || !fread(shader, size, sizeof(GLchar), file)) {
free(src);
@ -807,7 +805,37 @@ void VideoManager::renderer_init() {
renderer = new VideoRendererLegacy(setmgr);
}
else {
renderer = new VideoRendererModern(setmgr);
const std::string ver_core{"#version 130\n"};
const std::string ver_es{"#version 300 es\n"};
// Build a test vertex shader to check version compatibility
auto shadertest = [](const std::string ver) -> bool {
GLuint nullshader = glCreateShader(GL_VERTEX_SHADER);
std::string nullsrc = ver + "void main() {}\n";
const char *c_str = nullsrc.c_str();
glShaderSource(nullshader, 1, &c_str, NULL);
glCompileShader(nullshader);
GLint err;
glGetShaderiv(nullshader, GL_COMPILE_STATUS, &err);
glDeleteShader(nullshader);
return err != GL_FALSE;
};
if (shadertest(ver_core)) {
renderer = new VideoRendererModern(setmgr, ver_core);
LogDriver::log(LogLevel::Debug, "OpenGL 3.1");
}
else if (shadertest(ver_es)) {
renderer = new VideoRendererModern(setmgr, ver_es);
LogDriver::log(LogLevel::Debug, "OpenGL ES 3.0");
}
else {
renderer = new VideoRendererLegacy(setmgr);
LogDriver::log(LogLevel::Warn, "Legacy OpenGL (Fallback)");
}
}
}

View file

@ -1,5 +1,7 @@
#pragma once
#include <string>
#include <epoxy/gl.h>
#include "setmanager.h"
@ -55,7 +57,7 @@ public:
class VideoRendererModern : public VideoRenderer {
public:
VideoRendererModern() = delete;
VideoRendererModern(SettingManager& setmgr);
VideoRendererModern(SettingManager& setmgr, const std::string ver);
~VideoRendererModern() override;
void ogl_render() override;
@ -71,6 +73,8 @@ private:
static constexpr size_t NUMPASSES = 2;
#define SIZE_GLSLVER 20
std::string glslver{};
GLuint vao[NUMPASSES];
GLuint vbo[NUMPASSES];
GLuint shaderprog[NUMPASSES];