summaryrefslogtreecommitdiff
path: root/gl_calls.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gl_calls.cpp')
-rw-r--r--gl_calls.cpp168
1 files changed, 37 insertions, 131 deletions
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