Browse Source

hacks for VirtualBox VM GL which only supports single line shaders

pull/1639/head
bsp2 6 years ago
parent
commit
0a2c921f84
1 changed files with 104 additions and 17 deletions
  1. +104
    -17
      dep/include/nanovg_gl.h

+ 104
- 17
dep/include/nanovg_gl.h View File

@@ -18,6 +18,8 @@
#ifndef NANOVG_GL_H
#define NANOVG_GL_H

#include <stdio.h>

#ifdef __cplusplus
extern "C" {
#endif
@@ -426,24 +428,41 @@ static void glnvg__checkError(GLNVGcontext* gl, const char* str)
}
}

static int glnvg__createShader(GLNVGshader* shader, const char* name, const char* header, const char* opts, const char* vshader, const char* fshader)
/* static void loc_print_shader(char**lines, int numlines) { */
/* int i; */
/* for(i = 0; i < numlines; i++) */
/* { */
/* printf("xxx loc_print_shader: line[%d]=\"%s\"\n", i, lines[i]); */
/* } */
/* } */

static int glnvg__createShader(GLNVGshader* shader, const char* name, const char* header, const char* opts, const char *vshader, const char *fshader)
{
GLint status;
GLuint prog, vert, frag;
const char* str[3];
str[0] = header;
str[1] = opts != NULL ? opts : "";
/* const char* str[3]; */
/* str[0] = header; */
/* str[1] = opts != NULL ? opts : ""; */
/* vshader[0] = header; */
/* vshader[1] = opts != NULL ? opts : (char*)""; */
/* fshader[0] = header; */
/* fshader[1] = opts != NULL ? opts : (char*)""; */

memset(shader, 0, sizeof(*shader));

prog = glCreateProgram();
vert = glCreateShader(GL_VERTEX_SHADER);
frag = glCreateShader(GL_FRAGMENT_SHADER);
str[2] = vshader;
glShaderSource(vert, 3, str, 0);
str[2] = fshader;
glShaderSource(frag, 3, str, 0);

/* str[2] = vshader; */
/* printf("xxx glnvg__createShader: glShaderSource(vert, ..)\n"); */
/* loc_print_shader(vshader, vshader_numlines); */
glShaderSource(vert, 1, &vshader, 0);
/* str[2] = fshader; */
/* printf("xxx glnvg__createShader: glShaderSource(frag, ..)\n"); */
/* loc_print_shader(fshader, fshader_numlines); */
glShaderSource(frag, 1, &fshader, 0);

/* printf("xxx glnvg__createShader: compileShader(vert)\n"); */
glCompileShader(vert);
glGetShaderiv(vert, GL_COMPILE_STATUS, &status);
if (status != GL_TRUE) {
@@ -451,6 +470,7 @@ static int glnvg__createShader(GLNVGshader* shader, const char* name, const char
return 0;
}

/* printf("xxx glnvg__createShader: compileShader(frag)\n"); */
glCompileShader(frag);
glGetShaderiv(frag, GL_COMPILE_STATUS, &status);
if (status != GL_TRUE) {
@@ -458,14 +478,17 @@ static int glnvg__createShader(GLNVGshader* shader, const char* name, const char
return 0;
}

/* printf("xxx glnvg__createShader: attach shaders\n"); */
glAttachShader(prog, vert);
glAttachShader(prog, frag);

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

/* printf("xxx glnvg__createShader: link program\n"); */
glLinkProgram(prog);
glGetProgramiv(prog, GL_LINK_STATUS, &status);
/* printf("xxx glnvg__createShader: link program status=%u\n", status); */
if (status != GL_TRUE) {
glnvg__dumpProgramError(prog, name);
return 0;
@@ -505,9 +528,12 @@ static int glnvg__renderCreate(void* uptr)
GLNVGcontext* gl = (GLNVGcontext*)uptr;
int align = 4;

// (note) [bsp] 25Oct2018: the VirtualBox GL wrapper/driver does not support shader sources with multiple lines.
// the header+opts are therefore 'inlined' now
#if 0
// TODO: mediump float may not be enough for GLES2 in iOS.
// see the following discussion: https://github.com/memononen/nanovg/issues/46
static const char* shaderHeader =
static char* shaderHeader =
#if defined NANOVG_GL2
"#define NANOVG_GL2 1\n"
#elif defined NANOVG_GL3
@@ -527,8 +553,30 @@ static int glnvg__renderCreate(void* uptr)
"#define UNIFORMARRAY_SIZE 11\n"
#endif
"\n";
#endif

static const char* fillVertShader = {
#if defined NANOVG_GL2
"#define NANOVG_GL2 1\n"
#elif defined NANOVG_GL3
"#version 150 core\n"
"#define NANOVG_GL3 1\n"
#elif defined NANOVG_GLES2
"#version 100\n"
"#define NANOVG_GL2 1\n"
#elif defined NANOVG_GLES3
"#version 300 es\n"
"#define NANOVG_GL3 1\n"
#endif

#if NANOVG_GL_USE_UNIFORMBUFFER
"#define USE_UNIFORMBUFFER 1\n"
#else
"#define UNIFORMARRAY_SIZE 11\n"
#endif

"#define EDGE_AA 1\n" // opts

static const char* fillVertShader =
"#ifdef NANOVG_GL3\n"
" uniform vec2 viewSize;\n"
" in vec2 vertex;\n"
@@ -546,9 +594,31 @@ static int glnvg__renderCreate(void* uptr)
" ftcoord = tcoord;\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"
"}\n";
"}\n"
};

static const char* fillFragShader = {
#if defined NANOVG_GL2
"#define NANOVG_GL2 1\n"
#elif defined NANOVG_GL3
"#version 150 core\n"
"#define NANOVG_GL3 1\n"
#elif defined NANOVG_GLES2
"#version 100\n"
"#define NANOVG_GL2 1\n"
#elif defined NANOVG_GLES3
"#version 300 es\n"
"#define NANOVG_GL3 1\n"
#endif

#if NANOVG_GL_USE_UNIFORMBUFFER
"#define USE_UNIFORMBUFFER 1\n"
#else
"#define UNIFORMARRAY_SIZE 11\n"
#endif

"#define EDGE_AA 1\n" // opts

static const char* fillFragShader =
"#ifdef GL_ES\n"
"#if defined(GL_FRAGMENT_PRECISION_HIGH) || defined(NANOVG_GL3)\n"
" precision highp float;\n"
@@ -621,7 +691,8 @@ static int glnvg__renderCreate(void* uptr)
"}\n"
"#endif\n"
"\n"
"void main(void) {\n"
/* "void main(void) {\n" */
"void main() {\n"
" vec4 result;\n"
" float scissor = scissorMask(fpos);\n"
"#ifdef EDGE_AA\n"
@@ -671,26 +742,36 @@ static int glnvg__renderCreate(void* uptr)
"#else\n"
" gl_FragColor = result;\n"
"#endif\n"
"}\n";
"}\n"
};

glnvg__checkError(gl, "init");

/* printf("xxx glnvg__renderCreate: 1\n"); */
if (gl->flags & NVG_ANTIALIAS) {
if (glnvg__createShader(&gl->shader, "shader", shaderHeader, "#define EDGE_AA 1\n", fillVertShader, fillFragShader) == 0)
/* printf("xxx glnvg__renderCreate: 2a\n"); */
if (glnvg__createShader(&gl->shader, "shader", NULL/*shaderHeader*/, NULL/*"#define EDGE_AA 1\n"*/, fillVertShader, fillFragShader) == 0)
return 0;
} else {
if (glnvg__createShader(&gl->shader, "shader", shaderHeader, NULL, fillVertShader, fillFragShader) == 0)
/* printf("xxx glnvg__renderCreate: 2b\n"); */
if (glnvg__createShader(&gl->shader, "shader", NULL/*shaderHeader*/, NULL, fillVertShader, fillFragShader) == 0)
return 0;
}

/* printf("xxx glnvg__renderCreate: 3\n"); */

glnvg__checkError(gl, "uniform locations");
/* printf("xxx glnvg__renderCreate: 4\n"); */
glnvg__getUniforms(&gl->shader);
/* printf("xxx glnvg__renderCreate: 5\n"); */

// Create dynamic vertex array
#if defined NANOVG_GL3
glGenVertexArrays(1, &gl->vertArr);
#endif
glGenBuffers(1, &gl->vertBuf);
/* printf("xxx glnvg__renderCreate: 6\n"); */

#if NANOVG_GL_USE_UNIFORMBUFFER
// Create UBOs
@@ -700,10 +781,14 @@ static int glnvg__renderCreate(void* uptr)
#endif
gl->fragSize = sizeof(GLNVGfragUniforms) + align - sizeof(GLNVGfragUniforms) % align;

/* printf("xxx glnvg__renderCreate: 7\n"); */
glnvg__checkError(gl, "create done");
/* printf("xxx glnvg__renderCreate: 8\n"); */

glFinish();

/* printf("xxx glnvg__renderCreate: LEAVE\n"); */

return 1;
}

@@ -1582,7 +1667,9 @@ NVGcontext* nvgCreateGLES3(int flags)

gl->flags = flags;

/* printf("xxx nvgCreateInternal 1\n"); */
ctx = nvgCreateInternal(&params);
/* printf("xxx nvgCreateInternal 2\n"); */
if (ctx == NULL) goto error;

return ctx;


Loading…
Cancel
Save