From 51d02ae4890b5068d3343b03bffd7eec14df8ab6 Mon Sep 17 00:00:00 2001 From: Luke Benstead Date: Sun, 20 May 2018 21:28:48 +0100 Subject: [PATCH] Stub out some of the ARB_framebuffer_object extension --- GL/framebuffer.c | 44 ++++++++++++++++++++++++++++++++++++++++++-- GL/private.h | 1 + GL/texture.c | 7 +++++++ include/gl.h | 1 + include/glext.h | 31 ------------------------------- include/glkos.h | 31 +++++++++++++++++++++++++++++++ kos/dreamcast.cnf | 0 7 files changed, 82 insertions(+), 33 deletions(-) delete mode 100644 kos/dreamcast.cnf diff --git a/GL/framebuffer.c b/GL/framebuffer.c index ae5f3f8..8983a62 100644 --- a/GL/framebuffer.c +++ b/GL/framebuffer.c @@ -1,11 +1,14 @@ #include #include "private.h" - +#include "../include/glkos.h" typedef struct { GLuint index; GLuint texture_id; GLboolean is_complete; + + /* FIXME: Add OP, TR and PT lists per framebuffer */ + } FrameBuffer; static FrameBuffer* ACTIVE_FRAMEBUFFER = NULL; @@ -16,6 +19,14 @@ void initFramebuffers() { named_array_init(&FRAMEBUFFERS, sizeof(FrameBuffer), 32); } +void wipeTextureOnFramebuffers(GLuint texture) { + /* Spec says we don't update inactive framebuffers, they'll presumably just cause + * a GL_INVALID_OPERATION if we try to render to them */ + if(ACTIVE_FRAMEBUFFER && ACTIVE_FRAMEBUFFER->texture_id == texture) { + ACTIVE_FRAMEBUFFER->texture_id = 0; + } +} + void APIENTRY glGenFramebuffersEXT(GLsizei n, GLuint* framebuffers) { TRACE(); @@ -52,11 +63,26 @@ void APIENTRY glBindFramebufferEXT(GLenum target, GLuint framebuffer) { ACTIVE_FRAMEBUFFER = (FrameBuffer*) named_array_get(&FRAMEBUFFERS, framebuffer); } else { ACTIVE_FRAMEBUFFER = NULL; + + /* FIXME: This is where we need to submit the lists and then clear them. Binding zero means returning to the + * default framebuffer so we need to render a frame to the texture at that point */ } } void APIENTRY glFramebufferTexture2DEXT(GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level) { + if(texture != 0 && !glIsTexture(texture)) { + _glKosThrowError(GL_INVALID_OPERATION, __func__); + _glKosPrintError(); + return; + } + if(!ACTIVE_FRAMEBUFFER) { + _glKosThrowError(GL_INVALID_OPERATION, __func__); + _glKosPrintError(); + return; + } + + ACTIVE_FRAMEBUFFER->texture_id = texture; } void APIENTRY glGenerateMipmapEXT(GLenum target) { @@ -64,9 +90,23 @@ void APIENTRY glGenerateMipmapEXT(GLenum target) { } GLenum APIENTRY glCheckFramebufferStatusEXT(GLenum target) { + if(target != GL_FRAMEBUFFER_EXT) { + _glKosThrowError(GL_INVALID_ENUM, __func__); + _glKosPrintError(); + return 0; + } + if(!ACTIVE_FRAMEBUFFER) { + return GL_FRAMEBUFFER_COMPLETE_EXT; + } + + if(!ACTIVE_FRAMEBUFFER->texture_id) { + return GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT; + } + + return GL_FRAMEBUFFER_COMPLETE_EXT; } GLboolean APIENTRY glIsFramebufferEXT(GLuint framebuffer) { - + return (named_array_used(&FRAMEBUFFERS, framebuffer)) ? GL_TRUE : GL_FALSE; } diff --git a/GL/private.h b/GL/private.h index 0be873f..5f837c1 100644 --- a/GL/private.h +++ b/GL/private.h @@ -77,6 +77,7 @@ void _matrixLoadTexture(); void _matrixLoadRender(); void _applyRenderMatrix(); +void wipeTextureOnFramebuffers(GLuint texture); GLubyte checkImmediateModeInactive(const char* func); pvr_poly_cxt_t* getPVRContext(); diff --git a/GL/texture.c b/GL/texture.c index 4b6a7f3..713b826 100644 --- a/GL/texture.c +++ b/GL/texture.c @@ -62,6 +62,10 @@ void APIENTRY glActiveTextureARB(GLenum texture) { ACTIVE_TEXTURE = texture & 0xF; } +GLboolean APIENTRY glIsTexture(GLuint texture) { + return (named_array_used(&TEXTURE_OBJECTS, texture)) ? GL_TRUE : GL_FALSE; +} + void APIENTRY glGenTextures(GLsizei n, GLuint *textures) { TRACE(); @@ -88,6 +92,9 @@ void APIENTRY glDeleteTextures(GLsizei n, GLuint *textures) { while(n--) { TextureObject* txr = (TextureObject*) named_array_get(&TEXTURE_OBJECTS, *textures); + /* Make sure we update framebuffer objects that have this texture attached */ + wipeTextureOnFramebuffers(*textures); + if(txr == TEXTURE_UNITS[ACTIVE_TEXTURE]) { TEXTURE_UNITS[ACTIVE_TEXTURE] = NULL; } diff --git a/include/gl.h b/include/gl.h index 7e4701c..50171b0 100644 --- a/include/gl.h +++ b/include/gl.h @@ -495,6 +495,7 @@ GLAPI void APIENTRY glTexParameteri(GLenum target, GLenum pname, GLint param); GLAPI void APIENTRY glTexEnvi(GLenum target, GLenum pname, GLint param); GLAPI void APIENTRY glTexEnvf(GLenum target, GLenum pname, GLfloat param); +GLAPI GLboolean APIENTRY glIsTexture(GLuint texture); GLAPI void APIENTRY glGenTextures(GLsizei n, GLuint *textures); GLAPI void APIENTRY glDeleteTextures(GLsizei n, GLuint *textures); GLAPI void APIENTRY glBindTexture(GLenum target, GLuint texture); diff --git a/include/glext.h b/include/glext.h index e005224..2d52273 100644 --- a/include/glext.h +++ b/include/glext.h @@ -11,37 +11,6 @@ #include __BEGIN_DECLS -#define GL_COLOR_ATTACHMENT0 0x8CE0 -#define GL_COLOR_ATTACHMENT1 0x8CE1 -#define GL_COLOR_ATTACHMENT2 0x8CE2 -#define GL_COLOR_ATTACHMENT3 0x8CE3 -#define GL_COLOR_ATTACHMENT4 0x8CE4 -#define GL_COLOR_ATTACHMENT5 0x8CE5 -#define GL_COLOR_ATTACHMENT6 0x8CE6 -#define GL_COLOR_ATTACHMENT7 0x8CE7 -#define GL_COLOR_ATTACHMENT8 0x8CE8 -#define GL_COLOR_ATTACHMENT9 0x8CE9 -#define GL_COLOR_ATTACHMENT10 0x8CEA -#define GL_COLOR_ATTACHMENT11 0x8CEB -#define GL_COLOR_ATTACHMENT12 0x8CEC -#define GL_COLOR_ATTACHMENT13 0x8CED -#define GL_COLOR_ATTACHMENT14 0x8CEE -#define GL_COLOR_ATTACHMENT15 0x8CEF -#define GL_DEPTH_ATTACHMENT 0x8D00 -#define GL_STENCIL_ATTACHMENT 0x8D20 -#define GL_FRAMEBUFFER 0x8D40 -#define GL_RENDERBUFFER 0x8D41 -#define GL_RENDERBUFFER_WIDTH 0x8D42 -#define GL_RENDERBUFFER_HEIGHT 0x8D43 -#define GL_RENDERBUFFER_INTERNAL_FORMAT 0x8D44 - -#define GL_FRAMEBUFFER_COMPLETE 0x8CD5 -#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT 0x8CD6 -#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT 0x8CD7 -#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER 0x8CDB -#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER 0x8CDC -#define GL_FRAMEBUFFER_UNSUPPORTED 0x8CDD - #define GL_TEXTURE0_ARB 0x84C0 #define GL_TEXTURE1_ARB 0x84C1 #define GL_TEXTURE2_ARB 0x84C2 diff --git a/include/glkos.h b/include/glkos.h index 7bdd2fe..dea4591 100644 --- a/include/glkos.h +++ b/include/glkos.h @@ -5,6 +5,37 @@ __BEGIN_DECLS +#define GL_COLOR_ATTACHMENT0_EXT 0x8CE0 +#define GL_COLOR_ATTACHMENT1_EXT 0x8CE1 +#define GL_COLOR_ATTACHMENT2_EXT 0x8CE2 +#define GL_COLOR_ATTACHMENT3_EXT 0x8CE3 +#define GL_COLOR_ATTACHMENT4_EXT 0x8CE4 +#define GL_COLOR_ATTACHMENT5_EXT 0x8CE5 +#define GL_COLOR_ATTACHMENT6_EXT 0x8CE6 +#define GL_COLOR_ATTACHMENT7_EXT 0x8CE7 +#define GL_COLOR_ATTACHMENT8_EXT 0x8CE8 +#define GL_COLOR_ATTACHMENT9_EXT 0x8CE9 +#define GL_COLOR_ATTACHMENT10_EXT 0x8CEA +#define GL_COLOR_ATTACHMENT11_EXT 0x8CEB +#define GL_COLOR_ATTACHMENT12_EXT 0x8CEC +#define GL_COLOR_ATTACHMENT13_EXT 0x8CED +#define GL_COLOR_ATTACHMENT14_EXT 0x8CEE +#define GL_COLOR_ATTACHMENT15_EXT 0x8CEF +#define GL_DEPTH_ATTACHMENT_EXT 0x8D00 +#define GL_STENCIL_ATTACHMENT_EXT 0x8D20 +#define GL_FRAMEBUFFER_EXT 0x8D40 +#define GL_RENDERBUFFER_EXT 0x8D41 +#define GL_RENDERBUFFER_WIDTH_EXT 0x8D42 +#define GL_RENDERBUFFER_HEIGHT_EXT 0x8D43 +#define GL_RENDERBUFFER_INTERNAL_FORMAT_EXT 0x8D44 + +#define GL_FRAMEBUFFER_COMPLETE_EXT 0x8CD5 +#define GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT 0x8CD6 +#define GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT 0x8CD7 +#define GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT 0x8CDB +#define GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT 0x8CDC +#define GL_FRAMEBUFFER_UNSUPPORTED_EXT 0x8CDD + GLAPI void APIENTRY glKosSwapBuffers(); GLAPI void APIENTRY glGenFramebuffersEXT(GLsizei n, GLuint* framebuffers); diff --git a/kos/dreamcast.cnf b/kos/dreamcast.cnf deleted file mode 100644 index e69de29..0000000