UWP: Add support for GLES2 driver
This commit is contained in:
parent
ed55fb538a
commit
a684e853ab
5 changed files with 58 additions and 46 deletions
|
@ -143,14 +143,13 @@ void App::SetWindow(CoreWindow ^ p_window) {
|
||||||
window->KeyUp +=
|
window->KeyUp +=
|
||||||
ref new TypedEventHandler<CoreWindow ^, KeyEventArgs ^>(this, &App::OnKeyUp);
|
ref new TypedEventHandler<CoreWindow ^, KeyEventArgs ^>(this, &App::OnKeyUp);
|
||||||
|
|
||||||
|
os->set_window(window);
|
||||||
|
|
||||||
unsigned int argc;
|
unsigned int argc;
|
||||||
char **argv = get_command_line(&argc);
|
char **argv = get_command_line(&argc);
|
||||||
|
|
||||||
Main::setup("uwp", argc, argv, false);
|
Main::setup("uwp", argc, argv, false);
|
||||||
|
|
||||||
// The CoreWindow has been created, so EGL can be initialized.
|
|
||||||
ContextEGL *context = memnew(ContextEGL(window));
|
|
||||||
os->set_gl_context(context);
|
|
||||||
UpdateWindowSize(Size(window->Bounds.Width, window->Bounds.Height));
|
UpdateWindowSize(Size(window->Bounds.Width, window->Bounds.Height));
|
||||||
|
|
||||||
Main::setup2();
|
Main::setup2();
|
||||||
|
@ -513,7 +512,7 @@ char **App::get_command_line(unsigned int *out_argc) {
|
||||||
|
|
||||||
if (f == NULL) {
|
if (f == NULL) {
|
||||||
|
|
||||||
wprintf(L"Couldn't open command line file.");
|
wprintf(L"Couldn't open command line file.\n");
|
||||||
return fail_cl;
|
return fail_cl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -527,7 +526,7 @@ char **App::get_command_line(unsigned int *out_argc) {
|
||||||
|
|
||||||
if (r < 4) {
|
if (r < 4) {
|
||||||
fclose(f);
|
fclose(f);
|
||||||
wprintf(L"Wrong cmdline length.");
|
wprintf(L"Wrong cmdline length.\n");
|
||||||
return (fail_cl);
|
return (fail_cl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -539,7 +538,7 @@ char **App::get_command_line(unsigned int *out_argc) {
|
||||||
|
|
||||||
if (r < 4) {
|
if (r < 4) {
|
||||||
fclose(f);
|
fclose(f);
|
||||||
wprintf(L"Wrong cmdline param length.");
|
wprintf(L"Wrong cmdline param length.\n");
|
||||||
return (fail_cl);
|
return (fail_cl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -547,7 +546,7 @@ char **App::get_command_line(unsigned int *out_argc) {
|
||||||
|
|
||||||
if (strlen > CMD_MAX_LEN) {
|
if (strlen > CMD_MAX_LEN) {
|
||||||
fclose(f);
|
fclose(f);
|
||||||
wprintf(L"Wrong command length.");
|
wprintf(L"Wrong command length.\n");
|
||||||
return (fail_cl);
|
return (fail_cl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -568,7 +567,7 @@ char **App::get_command_line(unsigned int *out_argc) {
|
||||||
|
|
||||||
delete[] arg;
|
delete[] arg;
|
||||||
fclose(f);
|
fclose(f);
|
||||||
wprintf(L"Error reading command.");
|
wprintf(L"Error reading command.\n");
|
||||||
return (fail_cl);
|
return (fail_cl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,12 +93,26 @@ Error ContextEGL::initialize() {
|
||||||
|
|
||||||
EGLint numConfigs = 0;
|
EGLint numConfigs = 0;
|
||||||
EGLint majorVersion = 1;
|
EGLint majorVersion = 1;
|
||||||
EGLint minorVersion = 0;
|
EGLint minorVersion;
|
||||||
|
if (driver == GLES_2_0) {
|
||||||
|
minorVersion = 0;
|
||||||
|
} else {
|
||||||
|
minorVersion = 5;
|
||||||
|
}
|
||||||
EGLDisplay display = EGL_NO_DISPLAY;
|
EGLDisplay display = EGL_NO_DISPLAY;
|
||||||
EGLContext context = EGL_NO_CONTEXT;
|
EGLContext context = EGL_NO_CONTEXT;
|
||||||
EGLSurface surface = EGL_NO_SURFACE;
|
EGLSurface surface = EGL_NO_SURFACE;
|
||||||
EGLConfig config = nullptr;
|
EGLConfig config = nullptr;
|
||||||
EGLint contextAttribs[] = { EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE, EGL_NONE };
|
EGLint contextAttribs[3];
|
||||||
|
if (driver == GLES_2_0) {
|
||||||
|
contextAttribs[0] = EGL_CONTEXT_CLIENT_VERSION;
|
||||||
|
contextAttribs[1] = 2;
|
||||||
|
contextAttribs[2] = EGL_NONE;
|
||||||
|
} else {
|
||||||
|
contextAttribs[0] = EGL_CONTEXT_CLIENT_VERSION;
|
||||||
|
contextAttribs[1] = 3;
|
||||||
|
contextAttribs[2] = EGL_NONE;
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
||||||
|
@ -114,7 +128,8 @@ Error ContextEGL::initialize() {
|
||||||
|
|
||||||
// EGL_ANGLE_DISPLAY_ALLOW_RENDER_TO_BACK_BUFFER is an optimization that can have large performance benefits on mobile devices.
|
// EGL_ANGLE_DISPLAY_ALLOW_RENDER_TO_BACK_BUFFER is an optimization that can have large performance benefits on mobile devices.
|
||||||
// Its syntax is subject to change, though. Please update your Visual Studio templates if you experience compilation issues with it.
|
// Its syntax is subject to change, though. Please update your Visual Studio templates if you experience compilation issues with it.
|
||||||
//EGL_ANGLE_DISPLAY_ALLOW_RENDER_TO_BACK_BUFFER, EGL_TRUE,
|
EGL_ANGLE_DISPLAY_ALLOW_RENDER_TO_BACK_BUFFER,
|
||||||
|
EGL_TRUE,
|
||||||
|
|
||||||
// EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE is an option that enables ANGLE to automatically call
|
// EGL_PLATFORM_ANGLE_ENABLE_AUTOMATIC_TRIM_ANGLE is an option that enables ANGLE to automatically call
|
||||||
// the IDXGIDevice3::Trim method on behalf of the application when it gets suspended.
|
// the IDXGIDevice3::Trim method on behalf of the application when it gets suspended.
|
||||||
|
@ -193,13 +208,12 @@ void ContextEGL::cleanup() {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
ContextEGL::ContextEGL(CoreWindow ^ p_window) :
|
ContextEGL::ContextEGL(CoreWindow ^ p_window, Driver p_driver) :
|
||||||
mEglDisplay(EGL_NO_DISPLAY),
|
mEglDisplay(EGL_NO_DISPLAY),
|
||||||
mEglContext(EGL_NO_CONTEXT),
|
mEglContext(EGL_NO_CONTEXT),
|
||||||
mEglSurface(EGL_NO_SURFACE) {
|
mEglSurface(EGL_NO_SURFACE),
|
||||||
|
driver(p_driver),
|
||||||
window = p_window;
|
window(p_window) {}
|
||||||
};
|
|
||||||
|
|
||||||
ContextEGL::~ContextEGL() {
|
ContextEGL::~ContextEGL() {
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,13 @@ using namespace Windows::UI::Core;
|
||||||
|
|
||||||
class ContextEGL : public ContextGL {
|
class ContextEGL : public ContextGL {
|
||||||
|
|
||||||
|
public:
|
||||||
|
enum Driver {
|
||||||
|
GLES_2_0,
|
||||||
|
GLES_3_0,
|
||||||
|
};
|
||||||
|
|
||||||
|
private:
|
||||||
CoreWindow ^ window;
|
CoreWindow ^ window;
|
||||||
|
|
||||||
EGLDisplay mEglDisplay;
|
EGLDisplay mEglDisplay;
|
||||||
|
@ -53,6 +60,8 @@ class ContextEGL : public ContextGL {
|
||||||
|
|
||||||
bool vsync;
|
bool vsync;
|
||||||
|
|
||||||
|
Driver driver;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
virtual void release_current();
|
virtual void release_current();
|
||||||
|
|
||||||
|
@ -70,7 +79,7 @@ public:
|
||||||
|
|
||||||
void cleanup();
|
void cleanup();
|
||||||
|
|
||||||
ContextEGL(CoreWindow ^ p_window);
|
ContextEGL(CoreWindow ^ p_window, Driver p_driver);
|
||||||
~ContextEGL();
|
~ContextEGL();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
|
|
||||||
#include "os_uwp.h"
|
#include "os_uwp.h"
|
||||||
|
|
||||||
|
#include "drivers/gles2/rasterizer_gles2.h"
|
||||||
#include "drivers/gles3/rasterizer_gles3.h"
|
#include "drivers/gles3/rasterizer_gles3.h"
|
||||||
#include "drivers/unix/ip_unix.h"
|
#include "drivers/unix/ip_unix.h"
|
||||||
#include "drivers/windows/dir_access_windows.h"
|
#include "drivers/windows/dir_access_windows.h"
|
||||||
|
@ -66,12 +67,7 @@ using namespace Windows::ApplicationModel::DataTransfer;
|
||||||
using namespace concurrency;
|
using namespace concurrency;
|
||||||
|
|
||||||
int OSUWP::get_video_driver_count() const {
|
int OSUWP::get_video_driver_count() const {
|
||||||
|
return 2;
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
const char *OSUWP::get_video_driver_name(int p_driver) const {
|
|
||||||
|
|
||||||
return "GLES3";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Size2 OSUWP::get_window_size() const {
|
Size2 OSUWP::get_window_size() const {
|
||||||
|
@ -133,18 +129,6 @@ void OSUWP::set_keep_screen_on(bool p_enabled) {
|
||||||
OS::set_keep_screen_on(p_enabled);
|
OS::set_keep_screen_on(p_enabled);
|
||||||
}
|
}
|
||||||
|
|
||||||
int OSUWP::get_audio_driver_count() const {
|
|
||||||
|
|
||||||
return AudioDriverManager::get_driver_count();
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *OSUWP::get_audio_driver_name(int p_driver) const {
|
|
||||||
|
|
||||||
AudioDriver *driver = AudioDriverManager::get_driver(p_driver);
|
|
||||||
ERR_FAIL_COND_V(!driver, "");
|
|
||||||
return AudioDriverManager::get_driver(p_driver)->get_name();
|
|
||||||
}
|
|
||||||
|
|
||||||
void OSUWP::initialize_core() {
|
void OSUWP::initialize_core() {
|
||||||
|
|
||||||
last_button_state = 0;
|
last_button_state = 0;
|
||||||
|
@ -185,10 +169,9 @@ bool OSUWP::can_draw() const {
|
||||||
return !minimized;
|
return !minimized;
|
||||||
};
|
};
|
||||||
|
|
||||||
void OSUWP::set_gl_context(ContextEGL *p_context) {
|
void OSUWP::set_window(Windows::UI::Core::CoreWindow ^ p_window) {
|
||||||
|
window = p_window;
|
||||||
gl_context = p_context;
|
}
|
||||||
};
|
|
||||||
|
|
||||||
void OSUWP::screen_size_changed() {
|
void OSUWP::screen_size_changed() {
|
||||||
|
|
||||||
|
@ -200,6 +183,11 @@ Error OSUWP::initialize(const VideoMode &p_desired, int p_video_driver, int p_au
|
||||||
main_loop = NULL;
|
main_loop = NULL;
|
||||||
outside = true;
|
outside = true;
|
||||||
|
|
||||||
|
if (p_video_driver == VIDEO_DRIVER_GLES2) {
|
||||||
|
gl_context = memnew(ContextEGL(window, ContextEGL::GLES_2_0));
|
||||||
|
} else {
|
||||||
|
gl_context = memnew(ContextEGL(window, ContextEGL::GLES_3_0));
|
||||||
|
}
|
||||||
gl_context->initialize();
|
gl_context->initialize();
|
||||||
VideoMode vm;
|
VideoMode vm;
|
||||||
vm.width = gl_context->get_window_width();
|
vm.width = gl_context->get_window_width();
|
||||||
|
@ -240,8 +228,13 @@ Error OSUWP::initialize(const VideoMode &p_desired, int p_video_driver, int p_au
|
||||||
|
|
||||||
gl_context->make_current();
|
gl_context->make_current();
|
||||||
|
|
||||||
RasterizerGLES3::register_config();
|
if (p_video_driver == VIDEO_DRIVER_GLES2) {
|
||||||
RasterizerGLES3::make_current();
|
RasterizerGLES2::register_config();
|
||||||
|
RasterizerGLES2::make_current();
|
||||||
|
} else {
|
||||||
|
RasterizerGLES3::register_config();
|
||||||
|
RasterizerGLES3::make_current();
|
||||||
|
}
|
||||||
gl_context->set_use_vsync(vm.use_vsync);
|
gl_context->set_use_vsync(vm.use_vsync);
|
||||||
|
|
||||||
visual_server = memnew(VisualServerRaster);
|
visual_server = memnew(VisualServerRaster);
|
||||||
|
|
|
@ -96,6 +96,7 @@ private:
|
||||||
int pressrc;
|
int pressrc;
|
||||||
|
|
||||||
ContextEGL *gl_context;
|
ContextEGL *gl_context;
|
||||||
|
Windows::UI::Core::CoreWindow ^ window;
|
||||||
|
|
||||||
VideoMode video_mode;
|
VideoMode video_mode;
|
||||||
|
|
||||||
|
@ -153,10 +154,6 @@ private:
|
||||||
// functions used by main to initialize/deintialize the OS
|
// functions used by main to initialize/deintialize the OS
|
||||||
protected:
|
protected:
|
||||||
virtual int get_video_driver_count() const;
|
virtual int get_video_driver_count() const;
|
||||||
virtual const char *get_video_driver_name(int p_driver) const;
|
|
||||||
|
|
||||||
virtual int get_audio_driver_count() const;
|
|
||||||
virtual const char *get_audio_driver_name(int p_driver) const;
|
|
||||||
|
|
||||||
virtual void initialize_core();
|
virtual void initialize_core();
|
||||||
virtual Error initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver);
|
virtual Error initialize(const VideoMode &p_desired, int p_video_driver, int p_audio_driver);
|
||||||
|
@ -231,7 +228,7 @@ public:
|
||||||
|
|
||||||
virtual bool _check_internal_feature_support(const String &p_feature);
|
virtual bool _check_internal_feature_support(const String &p_feature);
|
||||||
|
|
||||||
void set_gl_context(ContextEGL *p_context);
|
void set_window(Windows::UI::Core::CoreWindow ^ p_window);
|
||||||
void screen_size_changed();
|
void screen_size_changed();
|
||||||
|
|
||||||
virtual void release_rendering_thread();
|
virtual void release_rendering_thread();
|
||||||
|
|
Loading…
Reference in a new issue