From fd315f15828b8537a48530c094ced845edc3a1d3 Mon Sep 17 00:00:00 2001 From: Fox Caminiti Date: Wed, 23 Nov 2022 20:39:55 -0500 Subject: effects reintroduction --- gl_calls.cpp | 168 +++++++++++++---------------------------------------------- 1 file changed, 37 insertions(+), 131 deletions(-) (limited to 'gl_calls.cpp') diff --git a/gl_calls.cpp b/gl_calls.cpp index 6f760b6..277db2e 100644 --- a/gl_calls.cpp +++ b/gl_calls.cpp @@ -168,9 +168,8 @@ GL_GenAndBindTexture(GLuint *GLTexture, int Width, int Height, int BytesPerPixel glTexImage2D(GL_TEXTURE_2D, 0, ByteFlag, Width, Height, 0, GL_RGBA, ByteFlag2, BufferAddress); } -#if 0 void -GL_InitTexture(gl_effect_layer *Test) +GL_InitHWBuffer(gl_effect_layer *Test) { glGenFramebuffers(1, &Test->FramebufferObject); glGenTextures(1, &Test->Texture); @@ -180,12 +179,22 @@ GL_InitTexture(gl_effect_layer *Test) } void -GL_UpdateTexture(gl_effect_layer *Test, void *Data, uint16 Width, uint16 Height, bool32 Multisample) +GL_DeleteHWBuffer(gl_effect_layer *Test) +{ + glDeleteFramebuffers(1, &Test->FramebufferObject); + glDeleteTextures(1, &Test->Texture); + glDeleteRenderbuffers(1, &Test->Color_Renderbuffer); + glDeleteRenderbuffers(1, &Test->Stencil_Renderbuffer); + Test->Initialized = true; +} + +void +GL_UpdateTexture(gl_effect_layer *Test, void *Data, uint16 Width, uint16 Height, uint16 BytesPerPixel, bool32 Multisample) { glViewport(0, 0, Width, Height); if (!Test->Initialized) { - GL_InitTexture(Test); + GL_InitHWBuffer(Test); } GLenum Target = GL_TEXTURE_2D; @@ -194,15 +203,25 @@ GL_UpdateTexture(gl_effect_layer *Test, void *Data, uint16 Width, uint16 Height, glBindTexture(Target, Test->Texture); + int Depth = 0, StencilDepth = 0; + if (BytesPerPixel == 4) { + Depth = GL_RGBA8; + StencilDepth = GL_STENCIL_INDEX8; + } else if (BytesPerPixel == 8) { + Depth = GL_RGBA16; + StencilDepth = GL_STENCIL_INDEX16; + } + if (Multisample) { // glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGB, Width, Height, GL_TRUE); glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, 0); glBindRenderbuffer(GL_RENDERBUFFER, Test->Color_Renderbuffer); - glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_RGBA8, Width, Height); + + glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, Depth, Width, Height); glBindRenderbuffer(GL_RENDERBUFFER, (GLuint)Test->Stencil_Renderbuffer ); - glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, GL_STENCIL_INDEX8, Width, Height ); + glRenderbufferStorageMultisample(GL_RENDERBUFFER, 4, StencilDepth, Width, Height ); } else { glTexParameteri(Target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(Target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); @@ -213,10 +232,10 @@ GL_UpdateTexture(gl_effect_layer *Test, void *Data, uint16 Width, uint16 Height, glBindTexture(GL_TEXTURE_2D, 0); glBindRenderbuffer(GL_RENDERBUFFER, Test->Color_Renderbuffer); - glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8, Width, Height); + glRenderbufferStorage(GL_RENDERBUFFER, Depth, Width, Height); glBindRenderbuffer(GL_RENDERBUFFER, (GLuint)Test->Stencil_Renderbuffer ); - glRenderbufferStorage(GL_RENDERBUFFER, GL_STENCIL_INDEX8, Width, Height ); + glRenderbufferStorage(GL_RENDERBUFFER, StencilDepth, Width, Height ); } glBindFramebuffer(GL_FRAMEBUFFER, Test->FramebufferObject); @@ -233,121 +252,9 @@ GL_UpdateTexture(gl_effect_layer *Test, void *Data, uint16 Width, uint16 Height, glBindFramebuffer(GL_FRAMEBUFFER, 0); } -static void -GL_BindDefaultVertexArrays() -{ - glBindVertexArray(DefaultVerts.VertexArrayObject); - // Switch to main buffer - glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, DefaultVerts.ElementBufferObject); - glBindBuffer(GL_ARRAY_BUFFER, DefaultVerts.VertexBufferObject); - glBufferData(GL_ARRAY_BUFFER, sizeof(GL_DefaultVertices), GL_DefaultVertices, GL_STATIC_DRAW); - // position attribute - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0); - glEnableVertexAttribArray(0); - // texture coordinate (note the last parameter's offset) - glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float))); - glEnableVertexAttribArray(1); - -} - -static void -GL_RasterizeShape(project_layer *Layer, mask *Mask) -{ - gl_effect_layer Test = Layer->BitmapInfo.TestM; - gl_effect_layer Test2 = Layer->BitmapInfo.Test; - gl_vertex_shader VertData; - - uint32 Width = Layer->Source->Info.Width; - uint32 Height = Layer->Source->Info.Height; - - uint8 *Data = (uint8 *)Layer->BitmapInfo.BitmapBuffer; - glBindFramebuffer(GL_FRAMEBUFFER, Test.FramebufferObject); - - glEnable(GL_STENCIL_TEST); - // glStencilOp(GL_KEEP, GL_REPLACE, GL_REPLACE); - glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); - glClearColor(0.0f, 0.0f, 0.0f, 0.0f); - glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); - - glStencilFunc(GL_ALWAYS, 0, 0xFF); // always write - glStencilMask(0xff); // allow writing; ANDs any writes to the stencil buffer with this - - glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); - - glUseProgram(DefaultShaderProgram); - - int VertexMode = glGetUniformLocation(DefaultShaderProgram, "VertexMode"); - int FragmentMode = glGetUniformLocation(DefaultShaderProgram, "FragmentMode"); - glUniform1i(VertexMode, 1); - glUniform1i(FragmentMode, 0); - - // secondary VBO - glGenVertexArrays(1, &VertData.VertexArrayObject); - glGenBuffers(1, &VertData.VertexBufferObject); - glBindVertexArray(VertData.VertexArrayObject); - glBindBuffer(GL_ARRAY_BUFFER, VertData.VertexBufferObject); - glBufferData(GL_ARRAY_BUFFER, Mask->NumberOfVerts*3*sizeof(real32), Mask->TriangulatedPointCache, GL_STREAM_DRAW); - - // position attribute - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); - glEnableVertexAttribArray(0); - - int Scale = glGetUniformLocation(DefaultShaderProgram, "CompDimensions"); - glUniform3f(Scale, Width, Height, 0); - - - glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_KEEP, GL_INCR_WRAP); - glStencilOpSeparate(GL_BACK, GL_KEEP, GL_KEEP, GL_DECR_WRAP); - - glDisable(GL_CULL_FACE); - - glDrawArrays(GL_TRIANGLE_FAN, 0, Mask->NumberOfVerts); - - // glEnable(GL_CULL_FACE); - - glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); - - glBindVertexArray(0); - - // glBindRenderbuffer(GL_RENDERBUFFER, Test.Color_Renderbuffer); - - VertexMode = glGetUniformLocation(DefaultShaderProgram, "VertexMode"); - FragmentMode = glGetUniformLocation(DefaultShaderProgram, "FragmentMode"); - glUniform1i(VertexMode, 0); - glUniform1i(FragmentMode, 1); - - GL_BindDefaultVertexArrays(); - - glStencilFunc(GL_NOTEQUAL, 0, 0xFF); - glStencilOp(GL_ZERO, GL_ZERO, GL_ZERO); - glDrawElements(GL_TRIANGLE_STRIP, 6, GL_UNSIGNED_INT, 0); - - glDisable(GL_STENCIL_TEST); - glStencilMask(0xFF); - glStencilFunc(GL_ALWAYS, 0, 0xFF); - - glBindFramebuffer(GL_READ_FRAMEBUFFER, Test.FramebufferObject); - glBindFramebuffer(GL_DRAW_FRAMEBUFFER, Test2.FramebufferObject); - glBlitFramebuffer(0, 0, Width, Height, 0, 0, Width, Height, - GL_COLOR_BUFFER_BIT, GL_NEAREST); - glBindFramebuffer(GL_FRAMEBUFFER, Test2.FramebufferObject); - - glReadPixels(0, 0, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, &Data[0]); - - glBindFramebuffer(GL_FRAMEBUFFER, 0); -} - static uint16 -Effect_GL_InitShader(int EffectIndex) +Effect_GL_InitShader(const char *FragmentShaderEffectSource) { - uint16 *ShaderProgram = &GL_EffectShaderProgram[EffectIndex]; - - // this is safe to do, riiight - if (*ShaderProgram) { - glUseProgram(*ShaderProgram); - return *ShaderProgram; - } - glShaderSource(DefaultVertexShader, 1, &DefaultVertexShaderSource, NULL); glCompileShader(DefaultVertexShader); @@ -363,7 +270,7 @@ Effect_GL_InitShader(int EffectIndex) uint32 FragmentShader = glCreateShader(GL_FRAGMENT_SHADER); - glShaderSource(FragmentShader, 1, &FragmentShaderEffectSource[EffectIndex], NULL); + glShaderSource(FragmentShader, 1, &FragmentShaderEffectSource, NULL); glCompileShader(FragmentShader); glGetShaderiv(FragmentShader, GL_COMPILE_STATUS, &success); @@ -374,22 +281,21 @@ Effect_GL_InitShader(int EffectIndex) printf("Fragment shader fail:\n %s", infoLog); } - *ShaderProgram = glCreateProgram(); + uint16 ShaderProgram = glCreateProgram(); - glAttachShader(*ShaderProgram, DefaultVertexShader); - glAttachShader(*ShaderProgram, FragmentShader); - glLinkProgram(*ShaderProgram); + glAttachShader(ShaderProgram, DefaultVertexShader); + glAttachShader(ShaderProgram, FragmentShader); + glLinkProgram(ShaderProgram); - glGetProgramiv(*ShaderProgram, GL_LINK_STATUS, &success); + glGetProgramiv(ShaderProgram, GL_LINK_STATUS, &success); if(!success) { - glGetProgramInfoLog(*ShaderProgram, 512, NULL, infoLog); + glGetProgramInfoLog(ShaderProgram, 512, NULL, infoLog); printf("Shader linkage fail:\n %s", infoLog); } glDeleteShader(FragmentShader); - glUseProgram(*ShaderProgram); + glUseProgram(ShaderProgram); - return *ShaderProgram; + return ShaderProgram; } -#endif -- cgit v1.2.3