Przeglądaj źródła

Merge pull request #784 from aichingm/master

Remove unnecessary indirection in glfe_opengl4 demo
Rob Loach 7 miesięcy temu
rodzic
commit
73ee62815f
1 zmienionych plików z 14 dodań i 69 usunięć
  1. 14 69
      demo/glfw_opengl4/nuklear_glfw_gl4.h

+ 14 - 69
demo/glfw_opengl4/nuklear_glfw_gl4.h

@@ -35,10 +35,8 @@ NK_API void                 nk_glfw3_char_callback(GLFWwindow *win, unsigned int
 NK_API void                 nk_gflw3_scroll_callback(GLFWwindow *win, double xoff, double yoff);
 NK_API void                 nk_gflw3_scroll_callback(GLFWwindow *win, double xoff, double yoff);
 NK_API void                 nk_glfw3_mouse_button_callback(GLFWwindow *win, int button, int action, int mods);
 NK_API void                 nk_glfw3_mouse_button_callback(GLFWwindow *win, int button, int action, int mods);
 
 
-NK_API GLuint               nk_glfw3_get_tex_ogl_id(int tex_index);
-NK_API GLuint64             nk_glfw3_get_tex_ogl_handle(int tex_index);
-NK_API int                  nk_glfw3_create_texture(const void* image, int width, int height);
-NK_API void                 nk_glfw3_destroy_texture(int tex_index);
+NK_API unsigned int                  nk_glfw3_create_texture(const void* image, int width, int height);
+NK_API void                 nk_glfw3_destroy_texture(unsigned int tex_index);
 
 
 #endif
 #endif
 /*
 /*
@@ -63,9 +61,6 @@ NK_API void                 nk_glfw3_destroy_texture(int tex_index);
 #ifndef NK_GLFW_DOUBLE_CLICK_HI
 #ifndef NK_GLFW_DOUBLE_CLICK_HI
 #define NK_GLFW_DOUBLE_CLICK_HI 0.2
 #define NK_GLFW_DOUBLE_CLICK_HI 0.2
 #endif
 #endif
-#ifndef NK_GLFW_MAX_TEXTURES
-#define NK_GLFW_MAX_TEXTURES 256
-#endif
 
 
 struct nk_glfw_vertex {
 struct nk_glfw_vertex {
     float position[2];
     float position[2];
@@ -91,8 +86,6 @@ struct nk_glfw_device {
     struct nk_glfw_vertex *vert_buffer;
     struct nk_glfw_vertex *vert_buffer;
     int *elem_buffer;
     int *elem_buffer;
     GLsync buffer_sync;
     GLsync buffer_sync;
-    GLuint tex_ids[NK_GLFW_MAX_TEXTURES];
-    GLuint64 tex_handles[NK_GLFW_MAX_TEXTURES];
 };
 };
 
 
 static struct nk_glfw {
 static struct nk_glfw {
@@ -150,12 +143,10 @@ nk_glfw3_device_create()
     dev->prog = glCreateProgram();
     dev->prog = glCreateProgram();
     dev->vert_shdr = glCreateShader(GL_VERTEX_SHADER);
     dev->vert_shdr = glCreateShader(GL_VERTEX_SHADER);
     dev->frag_shdr = glCreateShader(GL_FRAGMENT_SHADER);
     dev->frag_shdr = glCreateShader(GL_FRAGMENT_SHADER);
+
     glShaderSource(dev->vert_shdr, 1, &vertex_shader, 0);
     glShaderSource(dev->vert_shdr, 1, &vertex_shader, 0);
-    glShaderSource(dev->frag_shdr, 1, &fragment_shader, 0);
     glCompileShader(dev->vert_shdr);
     glCompileShader(dev->vert_shdr);
-    glCompileShader(dev->frag_shdr);
     glGetShaderiv(dev->vert_shdr, GL_COMPILE_STATUS, &status);
     glGetShaderiv(dev->vert_shdr, GL_COMPILE_STATUS, &status);
-
     glGetShaderiv(dev->vert_shdr, GL_INFO_LOG_LENGTH, &len);
     glGetShaderiv(dev->vert_shdr, GL_INFO_LOG_LENGTH, &len);
     if (len > 1) {
     if (len > 1) {
         char *log = (char*)calloc((size_t)len, sizeof(char));
         char *log = (char*)calloc((size_t)len, sizeof(char));
@@ -163,7 +154,11 @@ nk_glfw3_device_create()
         fprintf(stdout, "[GL]: failed to compile shader: %s", log);
         fprintf(stdout, "[GL]: failed to compile shader: %s", log);
         free(log);
         free(log);
     }
     }
+    assert(status == GL_TRUE);
 
 
+    glShaderSource(dev->frag_shdr, 1, &fragment_shader, 0);
+    glCompileShader(dev->frag_shdr);
+    glGetShaderiv(dev->frag_shdr, GL_COMPILE_STATUS, &status);
     glGetShaderiv(dev->frag_shdr, GL_INFO_LOG_LENGTH, &len);
     glGetShaderiv(dev->frag_shdr, GL_INFO_LOG_LENGTH, &len);
     if (len > 1) {
     if (len > 1) {
         char *log = (char*)calloc((size_t)len, sizeof(char));
         char *log = (char*)calloc((size_t)len, sizeof(char));
@@ -171,10 +166,8 @@ nk_glfw3_device_create()
         fprintf(stdout, "[GL]: failed to compile shader: %s", log);
         fprintf(stdout, "[GL]: failed to compile shader: %s", log);
         free(log);
         free(log);
     }
     }
-
-    assert(status == GL_TRUE);
-    glGetShaderiv(dev->frag_shdr, GL_COMPILE_STATUS, &status);
     assert(status == GL_TRUE);
     assert(status == GL_TRUE);
+
     glAttachShader(dev->prog, dev->vert_shdr);
     glAttachShader(dev->prog, dev->vert_shdr);
     glAttachShader(dev->prog, dev->frag_shdr);
     glAttachShader(dev->prog, dev->frag_shdr);
     glLinkProgram(dev->prog);
     glLinkProgram(dev->prog);
@@ -227,51 +220,16 @@ nk_glfw3_device_create()
     dev->vert_buffer = (struct nk_glfw_vertex*) glMapNamedBufferRange(dev->vbo, 0, vb_size, flags);
     dev->vert_buffer = (struct nk_glfw_vertex*) glMapNamedBufferRange(dev->vbo, 0, vb_size, flags);
     dev->elem_buffer = (int*) glMapNamedBufferRange(dev->ebo, 0, eb_size, flags);}
     dev->elem_buffer = (int*) glMapNamedBufferRange(dev->ebo, 0, eb_size, flags);}
 
 
-    memset(dev->tex_ids, 0, sizeof(dev->tex_ids));
-    memset(dev->tex_handles, 0, sizeof(dev->tex_handles));
-}
-
-NK_INTERN int
-nk_glfw3_get_available_tex_index()
-{
-    int i = 0;
-    struct nk_glfw_device *dev = &glfw.ogl;
-    for (i = 0; i < NK_GLFW_MAX_TEXTURES; i++) {
-        if (dev->tex_ids[i] == 0)
-            return i;
-    } assert(0); /* max textures reached */
-    return -1;
-}
-
-NK_API GLuint
-nk_glfw3_get_tex_ogl_id(int tex_index)
-{
-    struct nk_glfw_device *dev = &glfw.ogl;
-    assert(tex_index >= 0 && tex_index < NK_GLFW_MAX_TEXTURES);
-    return dev->tex_ids[tex_index];
-}
-
-NK_API GLuint64
-nk_glfw3_get_tex_ogl_handle(int tex_index)
-{
-    struct nk_glfw_device *dev = &glfw.ogl;
-    assert(tex_index >= 0 && tex_index < NK_GLFW_MAX_TEXTURES);
-    return dev->tex_handles[tex_index];
 }
 }
 
 
-NK_API int
+NK_API unsigned int
 nk_glfw3_create_texture(const void* image, int width, int height)
 nk_glfw3_create_texture(const void* image, int width, int height)
 {
 {
     GLuint id;
     GLuint id;
     GLsizei w = (GLsizei)width;
     GLsizei w = (GLsizei)width;
     GLsizei h = (GLsizei)height;
     GLsizei h = (GLsizei)height;
-    struct nk_glfw_device *dev = &glfw.ogl;
-    int tex_index = nk_glfw3_get_available_tex_index();
-    if (tex_index < 0)
-        return -1;
 
 
     glCreateTextures(GL_TEXTURE_2D, 1, &id);
     glCreateTextures(GL_TEXTURE_2D, 1, &id);
-    dev->tex_ids[tex_index] = id;
 
 
     glTextureParameteri(id, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
     glTextureParameteri(id, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
     glTextureParameteri(id, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
     glTextureParameteri(id, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
@@ -283,23 +241,15 @@ nk_glfw3_create_texture(const void* image, int width, int height)
     else glClearTexImage(id, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
     else glClearTexImage(id, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
 
 
     {GLuint64 handle = glGetTextureHandleARB(id);
     {GLuint64 handle = glGetTextureHandleARB(id);
-    glMakeTextureHandleResidentARB(handle);
-    dev->tex_handles[tex_index] = handle;
-    return tex_index;}
+    glMakeTextureHandleResidentARB(handle);}
+    return id;
 }
 }
 
 
 NK_API void
 NK_API void
-nk_glfw3_destroy_texture(int tex_index)
+nk_glfw3_destroy_texture(unsigned int id)
 {
 {
-    struct nk_glfw_device *dev = &glfw.ogl;
-    GLuint id = nk_glfw3_get_tex_ogl_id(tex_index);
-    if (id == 0) return;
-
-    {GLuint64 handle = nk_glfw3_get_tex_ogl_handle(tex_index);
-    glMakeTextureHandleNonResidentARB(handle);
+    glMakeTextureHandleNonResidentARB(glGetTextureHandleARB(id));
     glDeleteTextures(1, &id);
     glDeleteTextures(1, &id);
-    dev->tex_ids[tex_index] = 0;
-    dev->tex_handles[tex_index] = 0;}
 }
 }
 
 
 NK_INTERN void
 NK_INTERN void
@@ -312,7 +262,6 @@ nk_glfw3_device_upload_atlas(const void *image, int width, int height)
 NK_API void
 NK_API void
 nk_glfw3_device_destroy(void)
 nk_glfw3_device_destroy(void)
 {
 {
-    int i = 0;
     struct nk_glfw_device *dev = &glfw.ogl;
     struct nk_glfw_device *dev = &glfw.ogl;
     glDetachShader(dev->prog, dev->vert_shdr);
     glDetachShader(dev->prog, dev->vert_shdr);
     glDetachShader(dev->prog, dev->frag_shdr);
     glDetachShader(dev->prog, dev->frag_shdr);
@@ -321,8 +270,6 @@ nk_glfw3_device_destroy(void)
     glDeleteProgram(dev->prog);
     glDeleteProgram(dev->prog);
     nk_glfw3_destroy_texture(dev->font_tex_index);
     nk_glfw3_destroy_texture(dev->font_tex_index);
 
 
-    for (i = 0; i < NK_GLFW_MAX_TEXTURES; i++)
-        nk_glfw3_destroy_texture(i);
     glUnmapNamedBuffer(dev->vbo);
     glUnmapNamedBuffer(dev->vbo);
     glUnmapNamedBuffer(dev->ebo);
     glUnmapNamedBuffer(dev->ebo);
     glDeleteBuffers(1, &dev->vbo);
     glDeleteBuffers(1, &dev->vbo);
@@ -424,12 +371,10 @@ nk_glfw3_render(enum nk_anti_aliasing AA)
         /* iterate over and execute each draw command */
         /* iterate over and execute each draw command */
         nk_draw_foreach(cmd, &glfw.ctx, &dev->cmds)
         nk_draw_foreach(cmd, &glfw.ctx, &dev->cmds)
         {
         {
-            int tex_index;
             GLuint64 tex_handle;
             GLuint64 tex_handle;
             if (!cmd->elem_count) continue;
             if (!cmd->elem_count) continue;
 
 
-            tex_index = cmd->texture.id;
-            tex_handle = nk_glfw3_get_tex_ogl_handle(tex_index);
+            tex_handle = glGetTextureHandleARB((unsigned int)cmd->texture.id);
 
 
             /* tex handle must be made resident in each context that uses it */
             /* tex handle must be made resident in each context that uses it */
             if (!glIsTextureHandleResidentARB(tex_handle))
             if (!glIsTextureHandleResidentARB(tex_handle))