diff --git a/server/backend.cpp b/server/backend.cpp index 45e160bd..75b15c2b 100644 --- a/server/backend.cpp +++ b/server/backend.cpp @@ -1,4 +1,5 @@ // Copyright (C)2019-2023, 2025 D. R. Commander +// Copyright (C)2026 Tahmid Zaman // // This library is free software and may be redistributed and/or modified under // the terms of the wxWindows Library License, Version 3.1 or (at your option) @@ -65,6 +66,16 @@ static FakePbuffer *getCurrentFakePbuffer(EGLint readdraw) } +static void resolveDefaultFB(GLuint &framebuffer, EGLint readdraw = EGL_DRAW) +{ + FakePbuffer *pb; + if(framebuffer == 0 + && (pb = PBHASHEGL.find(readdraw == EGL_READ ? + getCurrentReadDrawableEGL() : getCurrentDrawableEGL())) != NULL) + framebuffer = pb->getFBO(); +} + + void bindFramebuffer(GLenum target, GLuint framebuffer, bool ext) { const GLenum *oldDrawBufs = NULL; GLsizei nDrawBufs = 0; @@ -144,6 +155,62 @@ void deleteFramebuffers(GLsizei n, const GLuint *framebuffers) } +void blitNamedFramebuffer(GLuint readFramebuffer, GLuint drawFramebuffer, + GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, + GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) +{ + if(fconfig.egl) + { + resolveDefaultFB(readFramebuffer, EGL_READ); + resolveDefaultFB(drawFramebuffer, EGL_DRAW); + } + _glBlitNamedFramebuffer(readFramebuffer, drawFramebuffer, srcX0, srcY0, srcX1, + srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); +} + + +GLenum checkNamedFramebufferStatus(GLuint framebuffer, GLenum target, bool ext) +{ + if(fconfig.egl) + resolveDefaultFB(framebuffer, + target == GL_READ_FRAMEBUFFER ? EGL_READ : EGL_DRAW); + if(ext) return _glCheckNamedFramebufferStatusEXT(framebuffer, target); + else return _glCheckNamedFramebufferStatus(framebuffer, target); +} + + +void clearNamedFramebufferfi(GLuint framebuffer, GLenum buffer, + GLint drawbuffer, GLfloat depth, GLint stencil) +{ + if(fconfig.egl) resolveDefaultFB(framebuffer); + _glClearNamedFramebufferfi(framebuffer, buffer, drawbuffer, depth, stencil); +} + + +void clearNamedFramebufferfv(GLuint framebuffer, GLenum buffer, + GLint drawbuffer, const GLfloat *value) +{ + if(fconfig.egl) resolveDefaultFB(framebuffer); + _glClearNamedFramebufferfv(framebuffer, buffer, drawbuffer, value); +} + + +void clearNamedFramebufferiv(GLuint framebuffer, GLenum buffer, + GLint drawbuffer, const GLint *value) +{ + if(fconfig.egl) resolveDefaultFB(framebuffer); + _glClearNamedFramebufferiv(framebuffer, buffer, drawbuffer, value); +} + + +void clearNamedFramebufferuiv(GLuint framebuffer, GLenum buffer, + GLint drawbuffer, const GLuint *value) +{ + if(fconfig.egl) resolveDefaultFB(framebuffer); + _glClearNamedFramebufferuiv(framebuffer, buffer, drawbuffer, value); +} + + GLXContext createContext(Display *dpy, VGLFBConfig config, GLXContext share, Bool direct, const int *glxAttribs) { @@ -531,6 +598,41 @@ int getFBConfigAttrib(Display *dpy, VGLFBConfig config, int attribute, } +static bool mapDefaultFBAttachment(FakePbuffer *pb, GLenum &attachment) +{ + switch(attachment) + { + case GL_FRONT_LEFT: + attachment = GL_COLOR_ATTACHMENT0; return true; + case GL_FRONT_RIGHT: + attachment = GL_COLOR_ATTACHMENT2; return true; + case GL_BACK_LEFT: + attachment = GL_COLOR_ATTACHMENT1; return true; + case GL_BACK_RIGHT: + attachment = GL_COLOR_ATTACHMENT3; return true; + case GL_DEPTH: + { + VGLFBConfig config = pb->getFBConfig(); + if(config->attr.stencilSize && config->attr.depthSize) + attachment = GL_DEPTH_STENCIL_ATTACHMENT; + else + attachment = GL_DEPTH_ATTACHMENT; + return true; + } + case GL_STENCIL: + { + VGLFBConfig config = pb->getFBConfig(); + if(config->attr.stencilSize && config->attr.depthSize) + attachment = GL_DEPTH_STENCIL_ATTACHMENT; + else + attachment = GL_STENCIL_ATTACHMENT; + return true; + } + } + return false; +} + + void getFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, GLenum pname, GLint *params) { @@ -552,43 +654,14 @@ void getFramebufferAttachmentParameteriv(GLenum target, GLenum attachment, && (pb = getCurrentFakePbuffer(EGL_DRAW)) != NULL) || (target == GL_READ_FRAMEBUFFER && (pb = getCurrentFakePbuffer(EGL_READ)) != NULL)) - { - switch(attachment) - { - case GL_FRONT_LEFT: - attachment = GL_COLOR_ATTACHMENT0; isDefault = true; break; - case GL_FRONT_RIGHT: - attachment = GL_COLOR_ATTACHMENT2; isDefault = true; break; - case GL_BACK_LEFT: - attachment = GL_COLOR_ATTACHMENT1; isDefault = true; break; - case GL_BACK_RIGHT: - attachment = GL_COLOR_ATTACHMENT3; isDefault = true; break; - case GL_DEPTH: - { - VGLFBConfig config = pb->getFBConfig(); - if(config->attr.stencilSize && config->attr.depthSize) - attachment = GL_DEPTH_STENCIL_ATTACHMENT; - else - attachment = GL_DEPTH_ATTACHMENT; - isDefault = true; break; - } - case GL_STENCIL: - { - VGLFBConfig config = pb->getFBConfig(); - if(config->attr.stencilSize && config->attr.depthSize) - attachment = GL_DEPTH_STENCIL_ATTACHMENT; - else - attachment = GL_STENCIL_ATTACHMENT; - isDefault = true; break; - } - } - } + isDefault = mapDefaultFBAttachment(pb, attachment); } } _glGetFramebufferAttachmentParameteriv(target, attachment, pname, params); if(fconfig.egl) { - if(isDefault && *params == GL_RENDERBUFFER) + if(isDefault && pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE + && *params == GL_RENDERBUFFER) *params = GL_FRAMEBUFFER_DEFAULT; } } @@ -625,6 +698,37 @@ void getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params) } +void getFramebufferParameterivEXT(GLuint framebuffer, GLenum pname, + GLint *params) +{ + if(fconfig.egl) + { + if(!params) + { + _glGetFramebufferParameterivEXT(framebuffer, pname, params); + return; + } + FakePbuffer *pb; + if(framebuffer == 0 + && (pb = PBHASHEGL.find(getCurrentDrawableEGL())) != NULL) + { + if(pname == GL_DOUBLEBUFFER) + { + *params = pb->getFBConfig()->attr.doubleBuffer; + return; + } + else if(pname == GL_STEREO) + { + *params = pb->getFBConfig()->attr.stereo; + return; + } + else framebuffer = pb->getFBO(); + } + } + _glGetFramebufferParameterivEXT(framebuffer, pname, params); +} + + void getIntegerv(GLenum pname, GLint *params) { if(fconfig.egl) @@ -740,6 +844,118 @@ void getNamedFramebufferParameteriv(GLuint framebuffer, GLenum pname, } +void getNamedFramebufferAttachmentParameteriv(GLuint framebuffer, + GLenum attachment, GLenum pname, GLint *params, bool ext) +{ + bool isDefault = false; + + if(fconfig.egl) + { + if(!params) + { + if(ext) + _glGetNamedFramebufferAttachmentParameterivEXT(framebuffer, + attachment, pname, params); + else + _glGetNamedFramebufferAttachmentParameteriv(framebuffer, attachment, + pname, params); + return; + } + FakePbuffer *pb; + if(framebuffer == 0 + && (pb = PBHASHEGL.find(getCurrentDrawableEGL())) != NULL) + { + if((attachment >= GL_FRONT_LEFT && attachment <= GL_BACK_RIGHT) + || (attachment >= GL_DEPTH && attachment <= GL_STENCIL)) + isDefault = mapDefaultFBAttachment(pb, attachment); + framebuffer = pb->getFBO(); + } + } + if(ext) + _glGetNamedFramebufferAttachmentParameterivEXT(framebuffer, attachment, + pname, params); + else + _glGetNamedFramebufferAttachmentParameteriv(framebuffer, attachment, pname, + params); + if(fconfig.egl) + { + if(isDefault && params && pname == GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE + && *params == GL_RENDERBUFFER) + *params = GL_FRAMEBUFFER_DEFAULT; + } +} + + +static GLenum *mapInvalidateAttachments(FakePbuffer *pb, + GLsizei numAttachments, const GLenum *attachments) +{ + if(numAttachments <= 0 || !attachments) return NULL; + VGLFBConfig config = pb->getFBConfig(); + bool combined = (config->attr.stencilSize && config->attr.depthSize); + GLenum *out = new GLenum[numAttachments]; + for(GLsizei i = 0; i < numAttachments; i++) + { + switch(attachments[i]) + { + case GL_COLOR: out[i] = GL_COLOR_ATTACHMENT0; break; + case GL_DEPTH: + out[i] = combined ? GL_DEPTH_STENCIL_ATTACHMENT : GL_DEPTH_ATTACHMENT; + break; + case GL_STENCIL: + out[i] = combined ? GL_DEPTH_STENCIL_ATTACHMENT : + GL_STENCIL_ATTACHMENT; + break; + default: out[i] = attachments[i]; break; + } + } + return out; +} + + +void invalidateNamedFramebufferData(GLuint framebuffer, GLsizei numAttachments, + const GLenum *attachments) +{ + GLenum *mapped = NULL; + + if(fconfig.egl) + { + FakePbuffer *pb; + if(framebuffer == 0 + && (pb = PBHASHEGL.find(getCurrentDrawableEGL())) != NULL) + { + mapped = mapInvalidateAttachments(pb, numAttachments, attachments); + if(mapped) attachments = mapped; + framebuffer = pb->getFBO(); + } + } + _glInvalidateNamedFramebufferData(framebuffer, numAttachments, attachments); + delete [] mapped; +} + + +void invalidateNamedFramebufferSubData(GLuint framebuffer, + GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, + GLsizei width, GLsizei height) +{ + GLenum *mapped = NULL; + + if(fconfig.egl) + { + FakePbuffer *pb; + if(framebuffer == 0 + && (pb = PBHASHEGL.find(getCurrentDrawableEGL())) != NULL) + { + mapped = mapInvalidateAttachments(pb, numAttachments, attachments); + if(mapped) attachments = mapped; + framebuffer = pb->getFBO(); + } + } + _glInvalidateNamedFramebufferSubData(framebuffer, numAttachments, attachments, + x, y, width, height); + delete [] mapped; +} + + Bool isDirect(GLXContext ctx) { if(fconfig.egl) diff --git a/server/backend.h b/server/backend.h index 9aebfb5b..6673fd1b 100644 --- a/server/backend.h +++ b/server/backend.h @@ -1,4 +1,5 @@ // Copyright (C)2019-2021 D. R. Commander +// Copyright (C)2026 Tahmid Zaman // // This library is free software and may be redistributed and/or modified under // the terms of the wxWindows Library License, Version 3.1 or (at your option) @@ -34,6 +35,25 @@ namespace backend { void bindFramebuffer(GLenum target, GLuint framebuffer, bool ext = false); + void blitNamedFramebuffer(GLuint readFramebuffer, GLuint drawFramebuffer, + GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, + GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); + + GLenum checkNamedFramebufferStatus(GLuint framebuffer, GLenum target, + bool ext = false); + + void clearNamedFramebufferfi(GLuint framebuffer, GLenum buffer, + GLint drawbuffer, GLfloat depth, GLint stencil); + + void clearNamedFramebufferfv(GLuint framebuffer, GLenum buffer, + GLint drawbuffer, const GLfloat *value); + + void clearNamedFramebufferiv(GLuint framebuffer, GLenum buffer, + GLint drawbuffer, const GLint *value); + + void clearNamedFramebufferuiv(GLuint framebuffer, GLenum buffer, + GLint drawbuffer, const GLuint *value); + GLXContext createContext(Display *dpy, VGLFBConfig config, GLXContext share, Bool direct, const int *glxAttribs); @@ -66,11 +86,24 @@ namespace backend void getFramebufferParameteriv(GLenum target, GLenum pname, GLint *params); + void getFramebufferParameterivEXT(GLuint framebuffer, GLenum pname, + GLint *params); + void getIntegerv(GLenum pname, GLint *params); + void getNamedFramebufferAttachmentParameteriv(GLuint framebuffer, + GLenum attachment, GLenum pname, GLint *params, bool ext = false); + void getNamedFramebufferParameteriv(GLuint framebuffer, GLenum pname, GLint *param); + void invalidateNamedFramebufferData(GLuint framebuffer, + GLsizei numAttachments, const GLenum *attachments); + + void invalidateNamedFramebufferSubData(GLuint framebuffer, + GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, + GLsizei width, GLsizei height); + Bool isDirect(GLXContext ctx); Bool makeCurrent(Display *dpy, GLXDrawable draw, GLXDrawable read, diff --git a/server/faker-egl.cpp b/server/faker-egl.cpp index af955a27..e51b9300 100644 --- a/server/faker-egl.cpp +++ b/server/faker-egl.cpp @@ -1,5 +1,6 @@ // Copyright (C)2005 Sun Microsystems, Inc. // Copyright (C)2011, 2014-2015, 2018, 2021-2025 D. R. Commander +// Copyright (C)2026 Tahmid Zaman // // This library is free software and may be redistributed and/or modified under // the terms of the wxWindows Library License, Version 3.1 or (at your option) @@ -1052,6 +1053,13 @@ void (*eglGetProcAddress(const char *procName))(void) // OpenGL CHECK_FAKED(glBindFramebuffer) CHECK_FAKED(glBindFramebufferEXT) + CHECK_FAKED(glBlitNamedFramebuffer) + CHECK_FAKED(glCheckNamedFramebufferStatus) + CHECK_FAKED(glCheckNamedFramebufferStatusEXT) + CHECK_FAKED(glClearNamedFramebufferfi) + CHECK_FAKED(glClearNamedFramebufferfv) + CHECK_FAKED(glClearNamedFramebufferiv) + CHECK_FAKED(glClearNamedFramebufferuiv) CHECK_FAKED(glDeleteFramebuffers) CHECK_FAKED(glDeleteFramebuffersEXT) CHECK_FAKED(glFinish) @@ -1068,11 +1076,16 @@ void (*eglGetProcAddress(const char *procName))(void) CHECK_FAKED(glGetFloatv) CHECK_FAKED(glGetFramebufferAttachmentParameteriv) CHECK_FAKED(glGetFramebufferParameteriv) + CHECK_FAKED(glGetFramebufferParameterivEXT) CHECK_FAKED(glGetIntegerv) CHECK_FAKED(glGetInteger64v) + CHECK_FAKED(glGetNamedFramebufferAttachmentParameteriv) + CHECK_FAKED(glGetNamedFramebufferAttachmentParameterivEXT) CHECK_FAKED(glGetNamedFramebufferParameteriv) CHECK_FAKED(glGetString) CHECK_FAKED(glGetStringi) + CHECK_FAKED(glInvalidateNamedFramebufferData) + CHECK_FAKED(glInvalidateNamedFramebufferSubData) CHECK_FAKED(glNamedFramebufferDrawBuffer) CHECK_FAKED(glNamedFramebufferDrawBuffers) CHECK_FAKED(glNamedFramebufferReadBuffer) diff --git a/server/faker-gl.cpp b/server/faker-gl.cpp index ec4c49fa..247fc59b 100644 --- a/server/faker-gl.cpp +++ b/server/faker-gl.cpp @@ -1,6 +1,7 @@ // Copyright (C)2004 Landmark Graphics Corporation // Copyright (C)2005, 2006 Sun Microsystems, Inc. // Copyright (C)2009, 2011-2012, 2015, 2018-2023 D. R. Commander +// Copyright (C)2026 Tahmid Zaman // // This library is free software and may be redistributed and/or modified under // the terms of the wxWindows Library License, Version 3.1 or (at your option) @@ -166,6 +167,130 @@ void glBindFramebufferEXT(GLenum target, GLuint framebuffer) } +void glBlitNamedFramebuffer(GLuint readFramebuffer, GLuint drawFramebuffer, + GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, + GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter) +{ + if(faker::getOGLExcludeCurrent() || faker::getEGLXContextCurrent()) + { + _glBlitNamedFramebuffer(readFramebuffer, drawFramebuffer, srcX0, srcY0, + srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); + return; + } + + TRY(); + + backend::blitNamedFramebuffer(readFramebuffer, drawFramebuffer, srcX0, srcY0, + srcX1, srcY1, dstX0, dstY0, dstX1, dstY1, mask, filter); + + CATCH(); +} + + +GLenum glCheckNamedFramebufferStatus(GLuint framebuffer, GLenum target) +{ + if(faker::getOGLExcludeCurrent() || faker::getEGLXContextCurrent()) + return _glCheckNamedFramebufferStatus(framebuffer, target); + + GLenum ret = GL_FRAMEBUFFER_UNDEFINED; + + TRY(); + + ret = backend::checkNamedFramebufferStatus(framebuffer, target); + + CATCH(); + + return ret; +} + + +GLenum glCheckNamedFramebufferStatusEXT(GLuint framebuffer, GLenum target) +{ + if(faker::getOGLExcludeCurrent() || faker::getEGLXContextCurrent()) + return _glCheckNamedFramebufferStatusEXT(framebuffer, target); + + GLenum ret = GL_FRAMEBUFFER_UNDEFINED; + + TRY(); + + ret = backend::checkNamedFramebufferStatus(framebuffer, target, true); + + CATCH(); + + return ret; +} + + +void glClearNamedFramebufferfi(GLuint framebuffer, GLenum buffer, + GLint drawbuffer, GLfloat depth, GLint stencil) +{ + if(faker::getOGLExcludeCurrent() || faker::getEGLXContextCurrent()) + { + _glClearNamedFramebufferfi(framebuffer, buffer, drawbuffer, depth, + stencil); + return; + } + + TRY(); + + backend::clearNamedFramebufferfi(framebuffer, buffer, drawbuffer, depth, + stencil); + + CATCH(); +} + + +void glClearNamedFramebufferfv(GLuint framebuffer, GLenum buffer, + GLint drawbuffer, const GLfloat *value) +{ + if(faker::getOGLExcludeCurrent() || faker::getEGLXContextCurrent()) + { + _glClearNamedFramebufferfv(framebuffer, buffer, drawbuffer, value); + return; + } + + TRY(); + + backend::clearNamedFramebufferfv(framebuffer, buffer, drawbuffer, value); + + CATCH(); +} + + +void glClearNamedFramebufferiv(GLuint framebuffer, GLenum buffer, + GLint drawbuffer, const GLint *value) +{ + if(faker::getOGLExcludeCurrent() || faker::getEGLXContextCurrent()) + { + _glClearNamedFramebufferiv(framebuffer, buffer, drawbuffer, value); + return; + } + + TRY(); + + backend::clearNamedFramebufferiv(framebuffer, buffer, drawbuffer, value); + + CATCH(); +} + + +void glClearNamedFramebufferuiv(GLuint framebuffer, GLenum buffer, + GLint drawbuffer, const GLuint *value) +{ + if(faker::getOGLExcludeCurrent() || faker::getEGLXContextCurrent()) + { + _glClearNamedFramebufferuiv(framebuffer, buffer, drawbuffer, value); + return; + } + + TRY(); + + backend::clearNamedFramebufferuiv(framebuffer, buffer, drawbuffer, value); + + CATCH(); +} + + void glDeleteFramebuffers(GLsizei n, const GLuint *framebuffers) { if(faker::getOGLExcludeCurrent() || faker::getEGLXContextCurrent()) @@ -536,6 +661,22 @@ void glGetFramebufferParameteriv(GLenum target, GLenum pname, GLint *params) } +void glGetFramebufferParameterivEXT(GLuint framebuffer, GLenum pname, + GLint *params) +{ + if(faker::getOGLExcludeCurrent() || faker::getEGLXContextCurrent()) + { + _glGetFramebufferParameterivEXT(framebuffer, pname, params); return; + } + + TRY(); + + backend::getFramebufferParameterivEXT(framebuffer, pname, params); + + CATCH(); +} + + void glGetIntegerv(GLenum pname, GLint *params) { if(faker::getOGLExcludeCurrent() || faker::getEGLXContextCurrent()) @@ -601,6 +742,44 @@ void glGetNamedFramebufferParameteriv(GLuint framebuffer, GLenum pname, } +void glGetNamedFramebufferAttachmentParameteriv(GLuint framebuffer, + GLenum attachment, GLenum pname, GLint *params) +{ + if(faker::getOGLExcludeCurrent() || faker::getEGLXContextCurrent()) + { + _glGetNamedFramebufferAttachmentParameteriv(framebuffer, attachment, pname, + params); + return; + } + + TRY() + + backend::getNamedFramebufferAttachmentParameteriv(framebuffer, attachment, + pname, params); + + CATCH(); +} + + +void glGetNamedFramebufferAttachmentParameterivEXT(GLuint framebuffer, + GLenum attachment, GLenum pname, GLint *params) +{ + if(faker::getOGLExcludeCurrent() || faker::getEGLXContextCurrent()) + { + _glGetNamedFramebufferAttachmentParameterivEXT(framebuffer, attachment, + pname, params); + return; + } + + TRY() + + backend::getNamedFramebufferAttachmentParameteriv(framebuffer, attachment, + pname, params, true); + + CATCH(); +} + + const GLubyte *glGetString(GLenum name) { char *string = NULL; @@ -663,6 +842,45 @@ const GLubyte *glGetStringi(GLenum name, GLuint index) } +void glInvalidateNamedFramebufferData(GLuint framebuffer, + GLsizei numAttachments, const GLenum *attachments) +{ + if(faker::getOGLExcludeCurrent() || faker::getEGLXContextCurrent()) + { + _glInvalidateNamedFramebufferData(framebuffer, numAttachments, + attachments); + return; + } + + TRY(); + + backend::invalidateNamedFramebufferData(framebuffer, numAttachments, + attachments); + + CATCH(); +} + + +void glInvalidateNamedFramebufferSubData(GLuint framebuffer, + GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, + GLsizei width, GLsizei height) +{ + if(faker::getOGLExcludeCurrent() || faker::getEGLXContextCurrent()) + { + _glInvalidateNamedFramebufferSubData(framebuffer, numAttachments, + attachments, x, y, width, height); + return; + } + + TRY(); + + backend::invalidateNamedFramebufferSubData(framebuffer, numAttachments, + attachments, x, y, width, height); + + CATCH(); +} + + void glNamedFramebufferDrawBuffer(GLuint framebuffer, GLenum buf) { if(faker::getOGLExcludeCurrent() || faker::getEGLXContextCurrent()) diff --git a/server/faker-glx.cpp b/server/faker-glx.cpp index 911d1ada..7ff16686 100644 --- a/server/faker-glx.cpp +++ b/server/faker-glx.cpp @@ -1,6 +1,7 @@ // Copyright (C)2004 Landmark Graphics Corporation // Copyright (C)2005, 2006 Sun Microsystems, Inc. // Copyright (C)2009, 2011-2024 D. R. Commander +// Copyright (C)2026 Tahmid Zaman // // This library is free software and may be redistributed and/or modified under // the terms of the wxWindows Library License, Version 3.1 or (at your option) @@ -1456,6 +1457,13 @@ void (*glXGetProcAddressARB(const GLubyte *procName))(void) // OpenGL CHECK_FAKED(glBindFramebuffer) CHECK_FAKED(glBindFramebufferEXT) + CHECK_FAKED(glBlitNamedFramebuffer) + CHECK_FAKED(glCheckNamedFramebufferStatus) + CHECK_FAKED(glCheckNamedFramebufferStatusEXT) + CHECK_FAKED(glClearNamedFramebufferfi) + CHECK_FAKED(glClearNamedFramebufferfv) + CHECK_FAKED(glClearNamedFramebufferiv) + CHECK_FAKED(glClearNamedFramebufferuiv) CHECK_FAKED(glDeleteFramebuffers) CHECK_FAKED(glDeleteFramebuffersEXT) CHECK_FAKED(glFinish) @@ -1472,11 +1480,16 @@ void (*glXGetProcAddressARB(const GLubyte *procName))(void) CHECK_FAKED(glGetFloatv) CHECK_FAKED(glGetFramebufferAttachmentParameteriv) CHECK_FAKED(glGetFramebufferParameteriv) + CHECK_FAKED(glGetFramebufferParameterivEXT) CHECK_FAKED(glGetIntegerv) CHECK_FAKED(glGetInteger64v) + CHECK_FAKED(glGetNamedFramebufferAttachmentParameteriv) + CHECK_FAKED(glGetNamedFramebufferAttachmentParameterivEXT) CHECK_FAKED(glGetNamedFramebufferParameteriv) CHECK_FAKED(glGetString) CHECK_FAKED(glGetStringi) + CHECK_FAKED(glInvalidateNamedFramebufferData) + CHECK_FAKED(glInvalidateNamedFramebufferSubData) CHECK_FAKED(glNamedFramebufferDrawBuffer) CHECK_FAKED(glNamedFramebufferDrawBuffers) CHECK_FAKED(glNamedFramebufferReadBuffer) diff --git a/server/faker-mapfile.c b/server/faker-mapfile.c index e17da3f7..da3dd69f 100644 --- a/server/faker-mapfile.c +++ b/server/faker-mapfile.c @@ -164,6 +164,13 @@ /* OpenGL */ glBindFramebuffer; glBindFramebufferEXT; + glBlitNamedFramebuffer; + glCheckNamedFramebufferStatus; + glCheckNamedFramebufferStatusEXT; + glClearNamedFramebufferfi; + glClearNamedFramebufferfv; + glClearNamedFramebufferiv; + glClearNamedFramebufferuiv; glDeleteFramebuffers; glDeleteFramebuffersEXT; glFinish; @@ -180,11 +187,16 @@ glGetFloatv; glGetFramebufferAttachmentParameteriv; glGetFramebufferParameteriv; + glGetFramebufferParameterivEXT; glGetIntegerv; glGetInteger64v; + glGetNamedFramebufferAttachmentParameteriv; + glGetNamedFramebufferAttachmentParameterivEXT; glGetNamedFramebufferParameteriv; glGetString; glGetStringi; + glInvalidateNamedFramebufferData; + glInvalidateNamedFramebufferSubData; glNamedFramebufferDrawBuffer; glNamedFramebufferDrawBuffers; glNamedFramebufferReadBuffer; diff --git a/server/faker-sym.h b/server/faker-sym.h index 37de7b5f..82a3be1e 100644 --- a/server/faker-sym.h +++ b/server/faker-sym.h @@ -1,6 +1,7 @@ // Copyright (C)2004 Landmark Graphics Corporation // Copyright (C)2005, 2006 Sun Microsystems, Inc. // Copyright (C)2009, 2011, 2013-2016, 2018-2022, 2025 D. R. Commander +// Copyright (C)2026 Tahmid Zaman // // This library is free software and may be redistributed and/or modified under // the terms of the wxWindows Library License, Version 3.1 or (at your option) @@ -348,6 +349,20 @@ extern "C" { return retval; \ } +#define VFUNCDEF12(f, at1, a1, at2, a2, at3, a3, at4, a4, at5, a5, at6, a6, \ + at7, a7, at8, a8, at9, a9, at10, a10, at11, a11, at12, a12, fake_f) \ + typedef void (*_##f##Type)(at1, at2, at3, at4, at5, at6, at7, at8, at9, \ + at10, at11, at12); \ + SYMDEF(f); \ + static INLINE void _##f(at1 a1, at2 a2, at3 a3, at4 a4, at5 a5, at6 a6, \ + at7 a7, at8 a8, at9 a9, at10 a10, at11 a11, at12 a12) \ + { \ + CHECKSYM(f, fake_f); \ + DISABLE_FAKER(); \ + __##f(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); \ + ENABLE_FAKER(); \ + } + #define FUNCDEF13(RetType, f, at1, a1, at2, a2, at3, a3, at4, a4, at5, a5, \ at6, a6, at7, a7, at8, a8, at9, a9, at10, a10, at11, a11, at12, a12, \ at13, a13, fake_f) \ @@ -788,6 +803,50 @@ VFUNCDEF2(glGetInteger64v, GLenum, pname, GLint64 *, data, glGetInteger64v) VFUNCDEF3(glGetNamedFramebufferParameteriv, GLuint, framebuffer, GLenum, pname, GLint *, param, glGetNamedFramebufferParameteriv) +// Named framebuffer functions that accept the default framebuffer (0) + +VFUNCDEF12(glBlitNamedFramebuffer, GLuint, readFramebuffer, GLuint, + drawFramebuffer, GLint, srcX0, GLint, srcY0, GLint, srcX1, GLint, srcY1, + GLint, dstX0, GLint, dstY0, GLint, dstX1, GLint, dstY1, GLbitfield, mask, + GLenum, filter, glBlitNamedFramebuffer) + +FUNCDEF2(GLenum, glCheckNamedFramebufferStatus, GLuint, framebuffer, + GLenum, target, glCheckNamedFramebufferStatus) + +FUNCDEF2(GLenum, glCheckNamedFramebufferStatusEXT, GLuint, framebuffer, + GLenum, target, glCheckNamedFramebufferStatusEXT) + +VFUNCDEF5(glClearNamedFramebufferfi, GLuint, framebuffer, GLenum, buffer, + GLint, drawbuffer, GLfloat, depth, GLint, stencil, glClearNamedFramebufferfi) + +VFUNCDEF4(glClearNamedFramebufferfv, GLuint, framebuffer, GLenum, buffer, + GLint, drawbuffer, const GLfloat *, value, glClearNamedFramebufferfv) + +VFUNCDEF4(glClearNamedFramebufferiv, GLuint, framebuffer, GLenum, buffer, + GLint, drawbuffer, const GLint *, value, glClearNamedFramebufferiv) + +VFUNCDEF4(glClearNamedFramebufferuiv, GLuint, framebuffer, GLenum, buffer, + GLint, drawbuffer, const GLuint *, value, glClearNamedFramebufferuiv) + +VFUNCDEF3(glGetFramebufferParameterivEXT, GLuint, framebuffer, GLenum, pname, + GLint *, params, glGetFramebufferParameterivEXT) + +VFUNCDEF4(glGetNamedFramebufferAttachmentParameteriv, GLuint, framebuffer, + GLenum, attachment, GLenum, pname, GLint *, params, + glGetNamedFramebufferAttachmentParameteriv) + +VFUNCDEF4(glGetNamedFramebufferAttachmentParameterivEXT, GLuint, framebuffer, + GLenum, attachment, GLenum, pname, GLint *, params, + glGetNamedFramebufferAttachmentParameterivEXT) + +VFUNCDEF3(glInvalidateNamedFramebufferData, GLuint, framebuffer, + GLsizei, numAttachments, const GLenum *, attachments, + glInvalidateNamedFramebufferData) + +VFUNCDEF7(glInvalidateNamedFramebufferSubData, GLuint, framebuffer, + GLsizei, numAttachments, const GLenum *, attachments, GLint, x, GLint, y, + GLsizei, width, GLsizei, height, glInvalidateNamedFramebufferSubData) + FUNCDEF1(const GLubyte *, glGetString, GLenum, name, glGetString) FUNCDEF2(const GLubyte *, glGetStringi, GLenum, name, GLuint, index,