Support use google angle support on windows.

This commit is contained in:
halx99 2020-06-12 12:42:58 +08:00
parent cd656f8b8b
commit 3d3fea28c6
5 changed files with 186 additions and 126 deletions

View File

@ -117,5 +117,7 @@ THE SOFTWARE.
#define CC_USE_GL
#endif
#define CC_USE_GLES_ON_DESKTOP 1
/// @endcond
#endif // __BASE_CC_PLATFORM_CONFIG_H__

View File

@ -47,8 +47,6 @@ THE SOFTWARE.
NS_CC_BEGIN
GLViewImpl* GLFWEventHandler::_view = nullptr;
const std::string GLViewImpl::EVENT_WINDOW_RESIZED = "glview_window_resized";
const std::string GLViewImpl::EVENT_WINDOW_FOCUSED = "glview_window_focused";
const std::string GLViewImpl::EVENT_WINDOW_UNFOCUSED = "glview_window_unfocused";
@ -194,6 +192,91 @@ static keyCodeItem g_keyCodeStructArray[] = {
};
//////////////////////////////////////////////////////////////////////////
// GLFW Event forward handler
//////////////////////////////////////////////////////////////////////////
class GLFWEventHandler
{
public:
static void onGLFWError(int errorID, const char* errorDesc)
{
if (_view)
_view->onGLFWError(errorID, errorDesc);
}
static void onGLFWMouseCallBack(GLFWwindow* window, int button, int action, int modify)
{
if (_view)
_view->onGLFWMouseCallBack(window, button, action, modify);
}
static void onGLFWMouseMoveCallBack(GLFWwindow* window, double x, double y)
{
if (_view)
_view->onGLFWMouseMoveCallBack(window, x, y);
}
static void onGLFWMouseScrollCallback(GLFWwindow* window, double x, double y)
{
if (_view)
_view->onGLFWMouseScrollCallback(window, x, y);
}
static void onGLFWKeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
if (_view)
_view->onGLFWKeyCallback(window, key, scancode, action, mods);
}
static void onGLFWCharCallback(GLFWwindow* window, unsigned int character)
{
if (_view)
_view->onGLFWCharCallback(window, character);
}
static void onGLFWWindowPosCallback(GLFWwindow* windows, int x, int y)
{
if (_view)
_view->onGLFWWindowPosCallback(windows, x, y);
}
static void onGLFWFrameBufferSizeCallback(GLFWwindow* window, int w, int h)
{
if (_view)
_view->onGLFWFramebufferSizeCallback(window, w, h);
}
static void onGLFWWindowSizeCallback(GLFWwindow* window, int width, int height)
{
if (_view)
_view->onGLFWWindowSizeCallback(window, width, height);
}
static void setGLViewImpl(GLViewImpl* view)
{
_view = view;
}
static void onGLFWWindowIconifyCallback(GLFWwindow* window, int iconified)
{
if (_view)
{
_view->onGLFWWindowIconifyCallback(window, iconified);
}
}
static void onGLFWWindowFocusCallback(GLFWwindow* window, int focused)
{
if (_view)
{
_view->onGLFWWindowFocusCallback(window, focused);
}
}
private:
static GLViewImpl* _view;
};
GLViewImpl* GLFWEventHandler::_view = nullptr;
// implement GLViewImpl
//////////////////////////////////////////////////////////////////////////
@ -286,6 +369,13 @@ bool GLViewImpl::initWithRect(const std::string& viewName, Rect rect, float fram
_frameZoomFactor = frameZoomFactor;
#if CC_USE_GLES_ON_DESKTOP
glfwWindowHint(GLFW_CLIENT_API, GLFW_OPENGL_ES_API);
glfwWindowHint(GLFW_CONTEXT_CREATION_API, GLFW_EGL_CONTEXT_API);
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
#endif
glfwWindowHint(GLFW_RESIZABLE,resizable?GL_TRUE:GL_FALSE);
glfwWindowHint(GLFW_RED_BITS,_glContextAttrs.redBits);
glfwWindowHint(GLFW_GREEN_BITS,_glContextAttrs.greenBits);
@ -348,21 +438,19 @@ bool GLViewImpl::initWithRect(const std::string& viewName, Rect rect, float fram
glfwSetCharCallback(_mainWindow, GLFWEventHandler::onGLFWCharCallback);
glfwSetKeyCallback(_mainWindow, GLFWEventHandler::onGLFWKeyCallback);
glfwSetWindowPosCallback(_mainWindow, GLFWEventHandler::onGLFWWindowPosCallback);
glfwSetFramebufferSizeCallback(_mainWindow, GLFWEventHandler::onGLFWframebuffersize);
glfwSetWindowSizeCallback(_mainWindow, GLFWEventHandler::onGLFWWindowSizeFunCallback);
glfwSetFramebufferSizeCallback(_mainWindow, GLFWEventHandler::onGLFWFrameBufferSizeCallback);
glfwSetWindowSizeCallback(_mainWindow, GLFWEventHandler::onGLFWWindowSizeCallback);
glfwSetWindowIconifyCallback(_mainWindow, GLFWEventHandler::onGLFWWindowIconifyCallback);
glfwSetWindowFocusCallback(_mainWindow, GLFWEventHandler::onGLFWWindowFocusCallback);
setFrameSize(rect.size.width, rect.size.height);
#if (CC_TARGET_PLATFORM != CC_PLATFORM_MAC)
loadGL();
// check OpenGL version at first
const GLubyte* glVersion = glGetString(GL_VERSION);
if ( utils::atof((const char*)glVersion) < 1.5 )
if ( utils::atof((const char*)glVersion) < 1.5 && nullptr == strstr((const char*)glVersion, "ANGLE") )
{
char strComplain[256] = {0};
sprintf(strComplain,
@ -372,22 +460,22 @@ bool GLViewImpl::initWithRect(const std::string& viewName, Rect rect, float fram
return false;
}
// Will cause OpenGL error 0x0500 when use ANGLE-GLES on desktop
#if !CC_USE_GLES_ON_DESKTOP
// Enable point size by default.
#if defined(GL_VERSION_2_0)
glEnable(GL_VERTEX_PROGRAM_POINT_SIZE);
#else
glEnable(GL_VERTEX_PROGRAM_POINT_SIZE_ARB);
#endif
if(_glContextAttrs.multisamplingCount > 0)
if (_glContextAttrs.multisamplingCount > 0)
glEnable(GL_MULTISAMPLE);
#endif
CHECK_GL_ERROR_DEBUG();
// // GLFW v3.2 no longer emits "onGLFWWindowSizeFunCallback" at creation time. Force default viewport:
// setViewPortInPoints(0, 0, neededWidth, neededHeight);
//
#endif
return true;
}
@ -816,12 +904,10 @@ void GLViewImpl::onGLFWMouseScrollCallback(GLFWwindow* /*window*/, double x, dou
void GLViewImpl::onGLFWKeyCallback(GLFWwindow* /*window*/, int key, int /*scancode*/, int action, int /*mods*/)
{
if (GLFW_REPEAT != action)
{
EventKeyboard event(g_keyCodeMap[key], GLFW_PRESS == action);
// x-studio spec, for repeat press key support.
EventKeyboard event(g_keyCodeMap[key], action);
auto dispatcher = Director::getInstance()->getEventDispatcher();
dispatcher->dispatchEvent(&event);
}
if (GLFW_RELEASE != action)
{
@ -876,8 +962,9 @@ void GLViewImpl::onGLFWWindowPosCallback(GLFWwindow* /*window*/, int /*x*/, int
Director::getInstance()->setViewport();
}
void GLViewImpl::onGLFWframebuffersize(GLFWwindow* window, int w, int h)
{
void GLViewImpl::onGLFWFramebufferSizeCallback(GLFWwindow* window, int w, int h)
{ // win32 glfw never invoke this callback
#if CC_TARGET_PLATFORM != CC_PLATFORM_WIN32
float frameSizeW = _screenSize.width;
float frameSizeH = _screenSize.height;
float factorX = frameSizeW / w * _retinaFactor * _frameZoomFactor;
@ -895,7 +982,7 @@ void GLViewImpl::onGLFWframebuffersize(GLFWwindow* window, int w, int h)
_retinaFactor = 2;
}
glfwSetWindowSize(window, static_cast<int>(frameSizeW * 0.5f * _retinaFactor * _frameZoomFactor), static_cast<int>(frameSizeH * 0.5f * _retinaFactor * _frameZoomFactor));
glfwSetWindowSize(window, static_cast<int>(frameSizeW * 0.5f * _retinaFactor * _frameZoomFactor) , static_cast<int>(frameSizeH * 0.5f * _retinaFactor * _frameZoomFactor));
}
else if (std::abs(factorX - 2.0f) < FLT_EPSILON && std::abs(factorY - 2.0f) < FLT_EPSILON)
{
@ -903,20 +990,16 @@ void GLViewImpl::onGLFWframebuffersize(GLFWwindow* window, int w, int h)
_retinaFactor = 1;
glfwSetWindowSize(window, static_cast<int>(frameSizeW * _retinaFactor * _frameZoomFactor), static_cast<int>(frameSizeH * _retinaFactor * _frameZoomFactor));
}
#endif
}
void GLViewImpl::onGLFWWindowSizeFunCallback(GLFWwindow* /*window*/, int width, int height)
void GLViewImpl::onGLFWWindowSizeCallback(GLFWwindow* /*window*/, int w, int h)
{
if (width && height && _resolutionPolicy != ResolutionPolicy::UNKNOWN)
if (w && h && _resolutionPolicy != ResolutionPolicy::UNKNOWN)
{
Size baseDesignSize = _designResolutionSize;
ResolutionPolicy baseResolutionPolicy = _resolutionPolicy;
// x-studio spec, fix view size incorrect when window size changed.
updateDesignResolutionSize();
float frameWidth = width / _frameZoomFactor;
float frameHeight = height / _frameZoomFactor;
setFrameSize(frameWidth, frameHeight);
setDesignResolutionSize(baseDesignSize.width, baseDesignSize.height, baseResolutionPolicy);
Director::getInstance()->setViewport();
Director::getInstance()->getEventDispatcher()->dispatchCustomEvent(GLViewImpl::EVENT_WINDOW_RESIZED, nullptr);
}
}
@ -1033,6 +1116,7 @@ bool GLViewImpl::loadGL()
// glad: load all OpenGL function pointers
// ---------------------------------------
#if !CC_USE_GLES_ON_DESKTOP
if (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress))
{
log("glad: Failed to Load GL");
@ -1045,15 +1129,16 @@ bool GLViewImpl::loadGL()
{
log("Not totally ready :(");
}
if (!loadFboExtensions())
#else
if (!gladLoadGLES2Loader((GLADloadproc)glfwGetProcAddress))
{
log("glad: Failed to Load GLES2");
return false;
#if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32
// close _vsync_ default for nvidia display card
::glfwSwapInterval(0);
}
#endif
loadFboExtensions();
#endif // (CC_TARGET_PLATFORM != CC_PLATFORM_MAC)
return true;

View File

@ -54,7 +54,7 @@ THE SOFTWARE.
NS_CC_BEGIN
class GLFWEventHandler;
class CC_DLL GLViewImpl : public GLView
{
public:
@ -149,8 +149,8 @@ protected:
void onGLFWKeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods);
void onGLFWCharCallback(GLFWwindow* window, unsigned int character);
void onGLFWWindowPosCallback(GLFWwindow* windows, int x, int y);
void onGLFWframebuffersize(GLFWwindow* window, int w, int h);
void onGLFWWindowSizeFunCallback(GLFWwindow *window, int width, int height);
void onGLFWFramebufferSizeCallback(GLFWwindow* window, int w, int h);
void onGLFWWindowSizeCallback(GLFWwindow *window, int width, int height);
void onGLFWWindowIconifyCallback(GLFWwindow* window, int iconified);
void onGLFWWindowFocusCallback(GLFWwindow* window, int focused);
@ -181,89 +181,4 @@ private:
CC_DISALLOW_COPY_AND_ASSIGN(GLViewImpl);
};
class CC_DLL GLFWEventHandler
{
public:
static void onGLFWError(int errorID, const char* errorDesc)
{
if (_view)
_view->onGLFWError(errorID, errorDesc);
}
static void onGLFWMouseCallBack(GLFWwindow* window, int button, int action, int modify)
{
if (_view)
_view->onGLFWMouseCallBack(window, button, action, modify);
}
static void onGLFWMouseMoveCallBack(GLFWwindow* window, double x, double y)
{
if (_view)
_view->onGLFWMouseMoveCallBack(window, x, y);
}
static void onGLFWMouseScrollCallback(GLFWwindow* window, double x, double y)
{
if (_view)
_view->onGLFWMouseScrollCallback(window, x, y);
}
static void onGLFWKeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods)
{
if (_view)
_view->onGLFWKeyCallback(window, key, scancode, action, mods);
}
static void onGLFWCharCallback(GLFWwindow* window, unsigned int character)
{
if (_view)
_view->onGLFWCharCallback(window, character);
}
static void onGLFWWindowPosCallback(GLFWwindow* windows, int x, int y)
{
if (_view)
_view->onGLFWWindowPosCallback(windows, x, y);
}
static void onGLFWWindowSizeFunCallback(GLFWwindow *window, int width, int height)
{
if (_view)
_view->onGLFWWindowSizeFunCallback(window, width, height);
}
static void onGLFWframebuffersize(GLFWwindow *window, int width, int height)
{
if (_view)
_view->onGLFWframebuffersize(window, width, height);
}
static void setGLViewImpl(GLViewImpl* view)
{
_view = view;
}
static void onGLFWWindowIconifyCallback(GLFWwindow* window, int iconified)
{
if (_view)
{
_view->onGLFWWindowIconifyCallback(window, iconified);
}
}
static void onGLFWWindowFocusCallback(GLFWwindow* window, int focused)
{
if (_view)
{
_view->onGLFWWindowFocusCallback(window, focused);
}
}
private:
static GLViewImpl* _view;
};
NS_CC_END // end of namespace cocos2d

View File

@ -25,6 +25,64 @@ THE SOFTWARE.
****************************************************************************/
#pragma once
#include "platform/CCPlatformConfig.h"
#if CC_TARGET_PLATFORM == CC_PLATFORM_WIN32
#include "glad/glad.h"
#if CC_USE_GLES_ON_DESKTOP
#undef glClearDepth
#undef glMapBuffer
#undef glUnmapBuffer
#undef glBindVertexArray
#undef glDeleteVertexArrays
#undef glGenVertexArrays
// #undef glBlendFuncSeparate
// #undef glBlendEquation
#if defined(GL_VERSION_ES_CM_1_0)
#undef glIsRenderbuffer
#undef glBindRenderbuffer
#undef glDeleteRenderbuffers
#undef glGenRenderbuffers
#undef glRenderbufferStorage
#undef glIsFramebuffer
#undef glBindFramebuffer
#undef glDeleteFramebuffers
#undef glGenFramebuffers
#undef glCheckFramebufferStatus
#undef glFramebufferRenderbuffer
#undef glFramebufferTexture2D
#undef glGetFramebufferAttachmentParameteriv
#undef glGenerateMipmap
#endif
#define glClearDepth glClearDepthf
#define glMapBuffer glMapBufferOES
#define glUnmapBuffer glUnmapBufferOES
#define glBindVertexArray glBindVertexArrayOES
#define glDeleteVertexArrays glDeleteVertexArraysOES
#define glGenVertexArrays glGenVertexArraysOES
// #define glBlendFuncSeparate glBlendFuncSeparateOES
// #define glBlendEquation glBlendEquationOES
#if defined(GL_VERSION_ES_CM_1_0)
#define glIsRenderbuffer glIsRenderbufferOES
#define glBindRenderbuffer glBindRenderbufferOES
#define glDeleteRenderbuffers glDeleteRenderbuffersOES
#define glGenRenderbuffers glGenRenderbuffersOES
#define glRenderbufferStorage glRenderbufferStorageOES
#define glIsFramebuffer glIsFramebufferOES
#define glBindFramebuffer glBindFramebufferOES
#define glDeleteFramebuffers glDeleteFramebuffersOES
#define glGenFramebuffers glGenFramebuffersOES
#define glCheckFramebufferStatus glCheckFramebufferStatusOES
#define glFramebufferRenderbuffer glFramebufferRenderbufferOES
#define glFramebufferTexture2D glFramebufferTexture2DOES
#define glGetFramebufferAttachmentParameteriv glGetFramebufferAttachmentParameterivOES
#define glGenerateMipmap glGenerateMipmapOES
#endif
#endif
#define CC_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8
#endif // CC_TARGET_PLATFORM == CC_PLATFORM_WIN32

View File

@ -41,7 +41,7 @@ namespace {
ProgramGL::ProgramGL(const std::string& vertexShader, const std::string& fragmentShader)
: Program(vertexShader, fragmentShader)
{
#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_USE_GLES_ON_DESKTOP
// some device required manually specify the precision qualifiers for vertex shader.
_vertexShaderModule = static_cast<ShaderModuleGL*>(ShaderCache::newVertexShaderModule(SHADER_PREDEFINE + _vertexShader));
_fragmentShaderModule = static_cast<ShaderModuleGL*>(ShaderCache::newFragmentShaderModule(SHADER_PREDEFINE + _fragmentShader));