Skip to content

Instantly share code, notes, and snippets.

@tuket
Created November 28, 2021 19:42
Show Gist options
  • Save tuket/2198c17107c513c667d7381bbb34386d to your computer and use it in GitHub Desktop.
Save tuket/2198c17107c513c667d7381bbb34386d to your computer and use it in GitHub Desktop.
A minamal example to reproduce a bug with glCopyImageSubData
#include <stdio.h>
#include <assert.h>
#include <stdint.h>
#include <SDL.h>
#include <glad/glad.h>
typedef uint32_t u32;
static const char* geGlErrStr(GLenum const err)
{
switch (err) {
case GL_NO_ERROR: return "GL_NO_ERROR";
case GL_INVALID_ENUM: return "GL_INVALID_ENUM";
case GL_INVALID_VALUE: return "GL_INVALID_VALUE";
case GL_INVALID_OPERATION: return "GL_INVALID_OPERATION";
case GL_OUT_OF_MEMORY: return "GL_OUT_OF_MEMORY";
case GL_INVALID_FRAMEBUFFER_OPERATION: return "GL_INVALID_FRAMEBUFFER_OPERATION";
default:
assert(!"unknown error");
return nullptr;
}
}
static void glPostCallback(const char* name, void* funcptr, int len_args, ...)
{
GLenum error_code;
error_code = glad_glGetError();
if (error_code != GL_NO_ERROR) {
fprintf(stderr, "ERROR %s in %s\n", geGlErrStr(error_code), name);
assert(false);
}
}
static float initTexData[2][64][3];
int main(int argc, char* argv[])
{
if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {
fprintf(stderr, "Error: %s\n", SDL_GetError());
return -1;
}
SDL_GL_SetAttribute(SDL_GL_CONTEXT_FLAGS, 0);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);
SDL_Window* window = SDL_CreateWindow("title",
SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED,
800, 600,
SDL_WINDOW_OPENGL | SDL_WINDOW_RESIZABLE
);
SDL_GLContext glContext = SDL_GL_CreateContext(window);
if (glContext == nullptr) {
printf("Error creating GLES context\n");
}
SDL_GL_MakeCurrent(window, glContext);
if (gladLoadGLLoader(SDL_GL_GetProcAddress) == 0) {
fprintf(stderr, "Failed to initialize OpenGL loader!\n");
return -1;
}
glad_set_post_callback(glPostCallback);
printf("Vendor: %s\n", glGetString(GL_VENDOR));
printf("Renderer: %s\n", glGetString(GL_RENDERER));
printf("Version: %s\n", glGetString(GL_VERSION));
u32 tex0;
glGenTextures(1, &tex0);
glBindTexture(GL_TEXTURE_1D_ARRAY, tex0);
glTexImage2D(GL_TEXTURE_1D_ARRAY, 0, GL_RGBA8, 64, 2, 0, GL_RGBA, GL_FLOAT, initTexData);
glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
u32 tex1;
glGenTextures(1, &tex1);
glBindTexture(GL_TEXTURE_1D_ARRAY, tex1);
glTexImage2D(GL_TEXTURE_1D_ARRAY, 0, GL_RGBA8, 64, 3, 0, GL_RGBA, GL_FLOAT, nullptr);
glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_1D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glCopyImageSubData(
tex0, GL_TEXTURE_1D_ARRAY,
0, 0, 0, 0,
tex1, GL_TEXTURE_1D_ARRAY,
0, 0, 0, 0,
64, 2, 1
);
printf("press any key to continue\n");
getchar();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment