mirror of
https://github.com/cemu-project/Cemu.git
synced 2025-07-09 00:11:17 +12:00
222 lines
7.4 KiB
C++
222 lines
7.4 KiB
C++
#pragma once
|
|
|
|
#include "glext.h"
|
|
|
|
#if BOOST_OS_WINDOWS > 0
|
|
#include "wglext.h"
|
|
#endif
|
|
|
|
#if BOOST_OS_LINUX > 0
|
|
|
|
// from Xlib
|
|
#define Bool int
|
|
#define Status int
|
|
#define True 1
|
|
#define False 0
|
|
|
|
// from system glx.h
|
|
typedef XID GLXContextID;
|
|
typedef XID GLXPixmap;
|
|
typedef XID GLXDrawable;
|
|
typedef XID GLXPbuffer;
|
|
typedef XID GLXWindow;
|
|
typedef XID GLXFBConfigID;
|
|
typedef struct __GLXcontextRec *GLXContext;
|
|
typedef struct __GLXFBConfigRec *GLXFBConfig;
|
|
|
|
#define EGL_EGL_PROTOTYPES 0
|
|
#include "egl.h"
|
|
#undef EGL_EGL_PROTOTYPES
|
|
#include "glxext.h"
|
|
|
|
#undef Bool
|
|
#undef Status
|
|
#undef True
|
|
#undef False
|
|
|
|
#endif
|
|
|
|
namespace CemuGL
|
|
{
|
|
#define GLFUNC(__type, __name) extern __type __name;
|
|
#define EGLFUNC(__type, __name) extern __type __name;
|
|
#include "glFunctions.h"
|
|
#undef GLFUNC
|
|
#undef EGLFUNC
|
|
|
|
// DSA-style helpers with fallback to legacy API if DSA is not supported
|
|
|
|
#define DSA_FORCE_DISABLE false // set to true to simulate DSA not being supported
|
|
|
|
static GLenum GetGLBindingFromTextureTarget(GLenum texTarget)
|
|
{
|
|
switch(texTarget)
|
|
{
|
|
case GL_TEXTURE_1D: return GL_TEXTURE_BINDING_1D;
|
|
case GL_TEXTURE_2D: return GL_TEXTURE_BINDING_2D;
|
|
case GL_TEXTURE_3D: return GL_TEXTURE_BINDING_3D;
|
|
case GL_TEXTURE_2D_ARRAY: return GL_TEXTURE_BINDING_2D_ARRAY;
|
|
case GL_TEXTURE_CUBE_MAP: return GL_TEXTURE_BINDING_CUBE_MAP;
|
|
case GL_TEXTURE_CUBE_MAP_ARRAY: return GL_TEXTURE_BINDING_CUBE_MAP_ARRAY;
|
|
default:
|
|
cemu_assert_unimplemented();
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
static GLuint glCreateTextureWrapper(GLenum target)
|
|
{
|
|
GLuint tex;
|
|
if (glCreateTextures && !DSA_FORCE_DISABLE)
|
|
{
|
|
glCreateTextures(target, 1, &tex);
|
|
return tex;
|
|
}
|
|
GLint originalTexture;
|
|
glGetIntegerv(GetGLBindingFromTextureTarget(target), &originalTexture);
|
|
glGenTextures(1, &tex);
|
|
glBindTexture(target, tex);
|
|
glBindTexture(target, originalTexture);
|
|
return tex;
|
|
}
|
|
|
|
static void glTextureStorage1DWrapper(GLenum target, GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width)
|
|
{
|
|
if (glTextureStorage1D && !DSA_FORCE_DISABLE)
|
|
{
|
|
glTextureStorage1D(texture, levels, internalformat, width);
|
|
return;
|
|
}
|
|
GLenum binding = GetGLBindingFromTextureTarget(target);
|
|
GLint originalTexture;
|
|
glGetIntegerv(binding, &originalTexture);
|
|
glBindTexture(target, texture);
|
|
glTexStorage1D(target, levels, internalformat, width);
|
|
glBindTexture(target, originalTexture);
|
|
}
|
|
|
|
static void glTextureStorage2DWrapper(GLenum target, GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height)
|
|
{
|
|
if (glTextureStorage2D && !DSA_FORCE_DISABLE)
|
|
{
|
|
glTextureStorage2D(texture, levels, internalformat, width, height);
|
|
return;
|
|
}
|
|
GLenum binding = GetGLBindingFromTextureTarget(target);
|
|
GLint originalTexture;
|
|
glGetIntegerv(binding, &originalTexture);
|
|
glBindTexture(target, texture);
|
|
glTexStorage2D(target, levels, internalformat, width, height);
|
|
glBindTexture(target, originalTexture);
|
|
}
|
|
|
|
static void glTextureStorage3DWrapper(GLenum target, GLuint texture, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth)
|
|
{
|
|
if (glTextureStorage3D && !DSA_FORCE_DISABLE)
|
|
{
|
|
glTextureStorage3D(texture, levels, internalformat, width, height, depth);
|
|
return;
|
|
}
|
|
GLenum binding = GetGLBindingFromTextureTarget(target);
|
|
GLint originalTexture;
|
|
glGetIntegerv(binding, &originalTexture);
|
|
glBindTexture(target, texture);
|
|
glTexStorage3D(target, levels, internalformat, width, height, depth);
|
|
glBindTexture(target, originalTexture);
|
|
}
|
|
|
|
static void glTextureSubImage1DWrapper(GLenum target, GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const void* pixels)
|
|
{
|
|
if (glTextureSubImage1D && !DSA_FORCE_DISABLE)
|
|
{
|
|
glTextureSubImage1D(texture, level, xoffset, width, format, type, pixels);
|
|
return;
|
|
}
|
|
GLenum binding = GetGLBindingFromTextureTarget(target);
|
|
GLint originalTexture;
|
|
glGetIntegerv(binding, &originalTexture);
|
|
glBindTexture(target, texture);
|
|
glTexSubImage1D(target, level, xoffset, width, format, type, pixels);
|
|
glBindTexture(target, originalTexture);
|
|
}
|
|
|
|
static void glCompressedTextureSubImage1DWrapper(GLenum target, GLuint texture, GLint level, GLint xoffset, GLsizei width, GLenum format, GLsizei imageSize, const void* data)
|
|
{
|
|
if (glCompressedTextureSubImage1D && !DSA_FORCE_DISABLE)
|
|
{
|
|
glCompressedTextureSubImage1D(texture, level, xoffset, width, format, imageSize, data);
|
|
return;
|
|
}
|
|
GLenum binding = GetGLBindingFromTextureTarget(target);
|
|
GLint originalTexture;
|
|
glGetIntegerv(binding, &originalTexture);
|
|
glBindTexture(target, texture);
|
|
glCompressedTexSubImage1D(target, level, xoffset, width, format, imageSize, data);
|
|
glBindTexture(target, originalTexture);
|
|
}
|
|
|
|
static void glTextureSubImage2DWrapper(GLenum target, GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels)
|
|
{
|
|
if (glTextureSubImage2D && !DSA_FORCE_DISABLE)
|
|
{
|
|
glTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, type, pixels);
|
|
return;
|
|
}
|
|
GLenum binding = GetGLBindingFromTextureTarget(target);
|
|
GLint originalTexture;
|
|
glGetIntegerv(binding, &originalTexture);
|
|
glBindTexture(target, texture);
|
|
glTexSubImage2D(target, level, xoffset, yoffset, width, height, format, type, pixels);
|
|
glBindTexture(target, originalTexture);
|
|
}
|
|
|
|
static void glCompressedTextureSubImage2DWrapper(GLenum target, GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void* data)
|
|
{
|
|
if (glCompressedTextureSubImage2D && !DSA_FORCE_DISABLE)
|
|
{
|
|
glCompressedTextureSubImage2D(texture, level, xoffset, yoffset, width, height, format, imageSize, data);
|
|
return;
|
|
}
|
|
GLenum binding = GetGLBindingFromTextureTarget(target);
|
|
GLint originalTexture;
|
|
glGetIntegerv(binding, &originalTexture);
|
|
glBindTexture(target, texture);
|
|
glCompressedTexSubImage2D(target, level, xoffset, yoffset, width, height, format, imageSize, data);
|
|
glBindTexture(target, originalTexture);
|
|
}
|
|
|
|
static void glTextureSubImage3DWrapper(GLenum target, GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLenum type, const void* pixels)
|
|
{
|
|
if(glTextureSubImage3D && !DSA_FORCE_DISABLE)
|
|
{
|
|
glTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
|
|
return;
|
|
}
|
|
GLenum binding = GetGLBindingFromTextureTarget(target);
|
|
GLint originalTexture;
|
|
glGetIntegerv(binding, &originalTexture);
|
|
glBindTexture(target, texture);
|
|
glTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, type, pixels);
|
|
glBindTexture(target, originalTexture);
|
|
}
|
|
|
|
static void glCompressedTextureSubImage3DWrapper(GLenum target, GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth, GLenum format, GLsizei imageSize, const void* data)
|
|
{
|
|
if(glCompressedTextureSubImage3D && !DSA_FORCE_DISABLE)
|
|
{
|
|
glCompressedTextureSubImage3D(texture, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
|
|
return;
|
|
}
|
|
GLenum binding = GetGLBindingFromTextureTarget(target);
|
|
GLint originalTexture;
|
|
glGetIntegerv(binding, &originalTexture);
|
|
glBindTexture(target, texture);
|
|
glCompressedTexSubImage3D(target, level, xoffset, yoffset, zoffset, width, height, depth, format, imageSize, data);
|
|
glBindTexture(target, originalTexture);
|
|
}
|
|
|
|
}
|
|
using namespace CemuGL;
|
|
// this prevents Windows GL.h from being included:
|
|
#define __gl_h_
|
|
#define __GL_H__
|