blob: 08e9f458b09340844127b394458dc0972e376bf7 [file] [log] [blame]
/*
* Copyright 2011 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "include/core/SkTypes.h"
#if defined(SK_BUILD_FOR_WIN)
#include "src/core/SkLeanWindows.h"
#include "include/gpu/gl/GrGLAssembleInterface.h"
#include "include/gpu/gl/GrGLInterface.h"
#include "src/gpu/gl/GrGLUtil.h"
#include <memory>
#include <type_traits>
#if defined(_M_ARM64)
sk_sp<const GrGLInterface> GrGLMakeNativeInterface() { return nullptr; }
#else
/*
* Windows makes the GL funcs all be __stdcall instead of __cdecl :(
* This implementation will only work if GR_GL_FUNCTION_TYPE is __stdcall.
* Otherwise, a springboard would be needed that hides the calling convention.
*/
sk_sp<const GrGLInterface> GrGLMakeNativeInterface() {
if (nullptr == wglGetCurrentContext()) {
return nullptr;
}
struct FreeModule { void operator()(HMODULE m) { (void)FreeLibrary(m); } };
std::unique_ptr<typename std::remove_pointer<HMODULE>::type, FreeModule> module(
LoadLibraryA("opengl32.dll"));
if (!module) {
return nullptr;
}
const GrGLGetProc win_get_gl_proc = [](void* ctx, const char* name) {
SkASSERT(wglGetCurrentContext());
if (GrGLFuncPtr p = (GrGLFuncPtr)GetProcAddress((HMODULE)ctx, name)) {
return p;
}
if (GrGLFuncPtr p = (GrGLFuncPtr)wglGetProcAddress(name)) {
return p;
}
return (GrGLFuncPtr)nullptr;
};
GrGLGetStringFn* getString =
(GrGLGetStringFn*)win_get_gl_proc((void*)module.get(), "glGetString");
if (!getString) {
return nullptr;
}
const char* verStr = reinterpret_cast<const char*>(getString(GR_GL_VERSION));
GrGLStandard standard = GrGLGetStandardInUseFromString(verStr);
if (GR_IS_GR_GL_ES(standard)) {
return GrGLMakeAssembledGLESInterface((void*)module.get(), win_get_gl_proc);
} else if (GR_IS_GR_GL(standard)) {
return GrGLMakeAssembledGLInterface((void*)module.get(), win_get_gl_proc);
}
return nullptr;
}
#endif // ARM64
const GrGLInterface* GrGLCreateNativeInterface() { return GrGLMakeNativeInterface().release(); }
#endif//defined(SK_BUILD_FOR_WIN)