Browse Source

Merge pull request #26 from dougbinks/develop2

Win32 modification to get code to run, and performance increase for buffered gl3
shared-context
Mikko Mononen 11 years ago
parent
commit
aa3925e945
2 changed files with 20 additions and 43 deletions
  1. +7
    -4
      example/example_gl3.c
  2. +13
    -39
      src/nanovg_gl3buf.h

+ 7
- 4
example/example_gl3.c View File

@@ -21,7 +21,9 @@
# include <GL/glew.h> # include <GL/glew.h>
#endif #endif
#define GLFW_NO_GLU #define GLFW_NO_GLU
#define GLFW_INCLUDE_GLCOREARB
#ifndef _WIN32
# define GLFW_INCLUDE_GLCOREARB
#endif
#include <GLFW/glfw3.h> #include <GLFW/glfw3.h>
#include "nanovg.h" #include "nanovg.h"
#define NANOVG_GL3_IMPLEMENTATION #define NANOVG_GL3_IMPLEMENTATION
@@ -63,18 +65,19 @@ int main()
initFPS(&fps); initFPS(&fps);


glfwSetErrorCallback(errorcb); glfwSetErrorCallback(errorcb);
#ifndef _WIN32 // don't require this on win32, and works with more cards
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
#endif

#ifdef DEMO_MSAA #ifdef DEMO_MSAA
glfwWindowHint(GLFW_SAMPLES, 4); glfwWindowHint(GLFW_SAMPLES, 4);
#endif #endif

window = glfwCreateWindow(1000, 600, "NanoVG", NULL, NULL); window = glfwCreateWindow(1000, 600, "NanoVG", NULL, NULL);
// window = glfwCreateWindow(1000, 600, "NanoVG", glfwGetPrimaryMonitor(), NULL); // window = glfwCreateWindow(1000, 600, "NanoVG", glfwGetPrimaryMonitor(), NULL);
if (!window) {
if (!window) {
glfwTerminate(); glfwTerminate();
return -1; return -1;
} }


+ 13
- 39
src/nanovg_gl3buf.h View File

@@ -256,7 +256,6 @@ static int glnvg__createShader(struct GLNVGshader* shader, const char* name, con


glBindAttribLocation(prog, 0, "vertex"); glBindAttribLocation(prog, 0, "vertex");
glBindAttribLocation(prog, 1, "tcoord"); glBindAttribLocation(prog, 1, "tcoord");
glBindAttribLocation(prog, 2, "color");


glLinkProgram(prog); glLinkProgram(prog);
glGetProgramiv(prog, GL_LINK_STATUS, &status); glGetProgramiv(prog, GL_LINK_STATUS, &status);
@@ -314,13 +313,10 @@ static int glnvg__renderCreate(void* uptr)
"uniform vec2 viewSize;\n" "uniform vec2 viewSize;\n"
"in vec2 vertex;\n" "in vec2 vertex;\n"
"in vec2 tcoord;\n" "in vec2 tcoord;\n"
"in vec4 color;\n"
"out vec2 ftcoord;\n" "out vec2 ftcoord;\n"
"out vec4 fcolor;\n"
"out vec2 fpos;\n" "out vec2 fpos;\n"
"void main(void) {\n" "void main(void) {\n"
" ftcoord = tcoord;\n" " ftcoord = tcoord;\n"
" fcolor = color;\n"
" fpos = vertex;\n" " fpos = vertex;\n"
" gl_Position = vec4(2.0*vertex.x/viewSize.x - 1.0, 1.0 - 2.0*vertex.y/viewSize.y, 0, 1);\n" " gl_Position = vec4(2.0*vertex.x/viewSize.x - 1.0, 1.0 - 2.0*vertex.y/viewSize.y, 0, 1);\n"
"}\n"; "}\n";
@@ -346,7 +342,6 @@ static int glnvg__renderCreate(void* uptr)
"uniform int texType;\n" "uniform int texType;\n"
"uniform int type;\n" "uniform int type;\n"
"in vec2 ftcoord;\n" "in vec2 ftcoord;\n"
"in vec4 fcolor;\n"
"in vec2 fpos;\n" "in vec2 fpos;\n"
"out vec4 outColor;\n" "out vec4 outColor;\n"
"\n" "\n"
@@ -394,7 +389,7 @@ static int glnvg__renderCreate(void* uptr)
" } else if (type == 3) { // Textured tris\n" " } else if (type == 3) { // Textured tris\n"
" vec4 color = texture(tex, ftcoord);\n" " vec4 color = texture(tex, ftcoord);\n"
" color = texType == 0 ? color : vec4(1,1,1,color.x);\n" " color = texType == 0 ? color : vec4(1,1,1,color.x);\n"
" outColor = color * fcolor;\n"
" outColor = color * innerCol;\n"
" }\n" " }\n"
"}\n"; "}\n";


@@ -419,7 +414,6 @@ static int glnvg__renderCreate(void* uptr)
"uniform int texType;\n" "uniform int texType;\n"
"uniform int type;\n" "uniform int type;\n"
"in vec2 ftcoord;\n" "in vec2 ftcoord;\n"
"in vec4 fcolor;\n"
"in vec2 fpos;\n" "in vec2 fpos;\n"
"out vec4 outColor;\n" "out vec4 outColor;\n"
"\n" "\n"
@@ -460,7 +454,7 @@ static int glnvg__renderCreate(void* uptr)
" } else if (type == 3) { // Textured tris\n" " } else if (type == 3) { // Textured tris\n"
" vec4 color = texture(tex, ftcoord);\n" " vec4 color = texture(tex, ftcoord);\n"
" color = texType == 0 ? color : vec4(1,1,1,color.x);\n" " color = texType == 0 ? color : vec4(1,1,1,color.x);\n"
" outColor = color * fcolor;\n"
" outColor = color * innerCol;\n"
" }\n" " }\n"
"}\n"; "}\n";


@@ -684,10 +678,7 @@ static void glnvg__fill(struct GLNVGcontext* gl, struct GLNVGcall* call)


glDisable(GL_CULL_FACE); glDisable(GL_CULL_FACE);
for (i = 0; i < npaths; i++) { for (i = 0; i < npaths; i++) {
offset = paths[i].fillOffset * sizeof(struct NVGvertex);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(size_t)offset);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(offset + 2*sizeof(float)));
glDrawArrays(GL_TRIANGLE_FAN, 0, paths[i].fillCount);
glDrawArrays(GL_TRIANGLE_FAN, paths[i].fillOffset, paths[i].fillCount);
} }


glEnable(GL_CULL_FACE); glEnable(GL_CULL_FACE);
@@ -695,10 +686,7 @@ static void glnvg__fill(struct GLNVGcontext* gl, struct GLNVGcall* call)
if (gl->edgeAntiAlias) { if (gl->edgeAntiAlias) {
// Draw fringes // Draw fringes
for (i = 0; i < npaths; i++) { for (i = 0; i < npaths; i++) {
offset = paths[i].strokeOffset * sizeof(struct NVGvertex);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(size_t)offset);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(offset + 2*sizeof(float)));
glDrawArrays(GL_TRIANGLE_STRIP, 0, paths[i].strokeCount);
glDrawArrays(GL_TRIANGLE_STRIP, paths[i].strokeOffset, paths[i].strokeCount);
} }
} }


@@ -721,10 +709,7 @@ static void glnvg__fill(struct GLNVGcontext* gl, struct GLNVGcall* call)
glStencilOpSeparate(GL_BACK, GL_KEEP, GL_KEEP, GL_DECR_WRAP); glStencilOpSeparate(GL_BACK, GL_KEEP, GL_KEEP, GL_DECR_WRAP);
glDisable(GL_CULL_FACE); glDisable(GL_CULL_FACE);
for (i = 0; i < npaths; i++) { for (i = 0; i < npaths; i++) {
offset = paths[i].fillOffset * sizeof(struct NVGvertex);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(size_t)offset);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(offset + 2*sizeof(float)));
glDrawArrays(GL_TRIANGLE_FAN, 0, paths[i].fillCount);
glDrawArrays(GL_TRIANGLE_FAN, paths[i].fillOffset, paths[i].fillCount);
} }


glEnable(GL_CULL_FACE); glEnable(GL_CULL_FACE);
@@ -733,7 +718,6 @@ static void glnvg__fill(struct GLNVGcontext* gl, struct GLNVGcall* call)
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
glEnable(GL_BLEND); glEnable(GL_BLEND);


glEnableVertexAttribArray(1);
glnvg__setupPaint(gl, &call->paint, &call->scissor, 1.0001f); glnvg__setupPaint(gl, &call->paint, &call->scissor, 1.0001f);


if (gl->edgeAntiAlias) { if (gl->edgeAntiAlias) {
@@ -742,20 +726,14 @@ static void glnvg__fill(struct GLNVGcontext* gl, struct GLNVGcall* call)


// Draw fringes // Draw fringes
for (i = 0; i < npaths; i++) { for (i = 0; i < npaths; i++) {
offset = paths[i].strokeOffset * sizeof(struct NVGvertex);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(size_t)offset);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(offset + 2*sizeof(float)));
glDrawArrays(GL_TRIANGLE_STRIP, 0, paths[i].strokeCount);
glDrawArrays(GL_TRIANGLE_STRIP, paths[i].strokeOffset, paths[i].strokeCount);
} }
} }


// Draw fill // Draw fill
glStencilFunc(GL_NOTEQUAL, 0x0, 0xff); glStencilFunc(GL_NOTEQUAL, 0x0, 0xff);
glStencilOp(GL_ZERO, GL_ZERO, GL_ZERO); glStencilOp(GL_ZERO, GL_ZERO, GL_ZERO);
offset = call->triangleOffset * sizeof(struct NVGvertex);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(size_t)offset);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(offset + 2*sizeof(float)));
glDrawArrays(GL_TRIANGLES, 0, call->triangleCount);
glDrawArrays(GL_TRIANGLES, call->triangleOffset, call->triangleCount);


glDisable(GL_STENCIL_TEST); glDisable(GL_STENCIL_TEST);
} }
@@ -772,10 +750,7 @@ static void glnvg__stroke(struct GLNVGcontext* gl, struct GLNVGcall* call)


// Draw Strokes // Draw Strokes
for (i = 0; i < npaths; i++) { for (i = 0; i < npaths; i++) {
offset = paths[i].strokeOffset * sizeof(struct NVGvertex);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(size_t)offset);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(offset + 2*sizeof(float)));
glDrawArrays(GL_TRIANGLE_STRIP, 0, paths[i].strokeCount);
glDrawArrays(GL_TRIANGLE_STRIP, paths[i].strokeOffset, paths[i].strokeCount);
} }
} }


@@ -793,15 +768,12 @@ static void glnvg__triangles(struct GLNVGcontext* gl, struct GLNVGcall* call)
glUniform2f(gl->shader.loc[GLNVG_LOC_VIEWSIZE], gl->viewWidth, gl->viewHeight); glUniform2f(gl->shader.loc[GLNVG_LOC_VIEWSIZE], gl->viewWidth, gl->viewHeight);
glUniform1i(gl->shader.loc[GLNVG_LOC_TEX], 0); glUniform1i(gl->shader.loc[GLNVG_LOC_TEX], 0);
glUniform1i(gl->shader.loc[GLNVG_LOC_TEXTYPE], tex->type == NVG_TEXTURE_RGBA ? 0 : 1); glUniform1i(gl->shader.loc[GLNVG_LOC_TEXTYPE], tex->type == NVG_TEXTURE_RGBA ? 0 : 1);
glnvg__toFloatColor(color, call->paint.innerColor);
glUniform4fv(gl->shader.loc[GLNVG_LOC_INNERCOL], 1, color );
glnvg__checkError("tris solid img loc"); glnvg__checkError("tris solid img loc");


glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(size_t)offset);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(offset + 2 * sizeof(float)));

glnvg__toFloatColor(color, call->paint.innerColor);
glVertexAttrib4fv(2, color);


glDrawArrays(GL_TRIANGLES, 0, call->triangleCount);
glDrawArrays(GL_TRIANGLES, call->triangleOffset, call->triangleCount);
} }


static void glnvg__renderFlush(void* uptr) static void glnvg__renderFlush(void* uptr)
@@ -819,6 +791,8 @@ static void glnvg__renderFlush(void* uptr)
glBufferData(GL_ARRAY_BUFFER, gl->nverts * sizeof(struct NVGvertex), gl->verts, GL_STREAM_DRAW); glBufferData(GL_ARRAY_BUFFER, gl->nverts * sizeof(struct NVGvertex), gl->verts, GL_STREAM_DRAW);
glEnableVertexAttribArray(0); glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1); glEnableVertexAttribArray(1);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(size_t)0);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(struct NVGvertex), (const GLvoid*)(0 + 2*sizeof(float)));


for (i = 0; i < gl->ncalls; i++) { for (i = 0; i < gl->ncalls; i++) {
struct GLNVGcall* call = &gl->calls[i]; struct GLNVGcall* call = &gl->calls[i];


Loading…
Cancel
Save