mirror of
https://github.com/MobileGL-Dev/MobileGlues.git
synced 2025-09-22 10:42:11 -04:00
[Misc] (...): Changes for fpe.
This commit is contained in:
parent
9a879d228a
commit
a097855389
@ -53,6 +53,7 @@ add_library(${CMAKE_PROJECT_NAME} SHARED
|
|||||||
config/settings.cpp
|
config/settings.cpp
|
||||||
gl/glsl/glslconv_gl4es.cpp
|
gl/glsl/glslconv_gl4es.cpp
|
||||||
|
|
||||||
|
gl/gl4es/gl/vgpu/shaderconv.c
|
||||||
gl/gl4es/gl/string_utils.c
|
gl/gl4es/gl/string_utils.c
|
||||||
gl/gl4es/gl/arbconverter.c
|
gl/gl4es/gl/arbconverter.c
|
||||||
gl/gl4es/gl/arbgenerator.c
|
gl/gl4es/gl/arbgenerator.c
|
||||||
|
@ -350,6 +350,13 @@ EXPORT void glFramebufferTexture3DARB(GLenum target, GLenum attachment,
|
|||||||
EXPORT void glDrawBuffersARB(GLsizei n, const GLenum *bufs) {
|
EXPORT void glDrawBuffersARB(GLsizei n, const GLenum *bufs) {
|
||||||
glDrawBuffers(n, bufs);
|
glDrawBuffers(n, bufs);
|
||||||
}
|
}
|
||||||
|
EXPORT void glFramebufferTexture1DEXT(GLenum target, GLenum attachment, GLenum textarget,
|
||||||
|
GLuint texture, GLint level) {
|
||||||
|
glFramebufferTexture2D(target, attachment, GL_TEXTURE_2D, texture, level);
|
||||||
|
}
|
||||||
|
EXPORT void glFramebufferTexture3DEXT(GLenum target, GLenum attachment, GLenum textarget,
|
||||||
|
GLuint texture, GLint level, GLint zoffset) {
|
||||||
|
LOG()
|
||||||
|
GLES.glFramebufferTexture3DOES(target, attachment, textarget, texture, level, zoffset);
|
||||||
|
}
|
||||||
}
|
}
|
@ -1497,7 +1497,7 @@ void APIENTRY_GL4ES gl4es_glBlitFramebuffer(GLint srcX0, GLint srcY0, GLint srcX
|
|||||||
memcpy(vp, &glstate->raster.viewport, sizeof(vp));
|
memcpy(vp, &glstate->raster.viewport, sizeof(vp));
|
||||||
gl4es_glViewport(0, 0, fbowidth, fboheight);
|
gl4es_glViewport(0, 0, fbowidth, fboheight);
|
||||||
// TODO: Handle the conflict between Core Profile with Compatibility Profile
|
// TODO: Handle the conflict between Core Profile with Compatibility Profile
|
||||||
gl4es_blitTexture(glname, srcX0, srcY0, srcW, srcH, nwidth, nheight, zoomx, zoomy, 0, 0, dstX0, dstY0, BLIT_OPAQUE);
|
//gl4es_blitTexture(glname, srcX0, srcY0, srcW, srcH, nwidth, nheight, zoomx, zoomy, 0, 0, dstX0, dstY0, BLIT_OPAQUE);
|
||||||
gl4es_glViewport(vp[0], vp[1], vp[2], vp[3]);
|
gl4es_glViewport(vp[0], vp[1], vp[2], vp[3]);
|
||||||
if(created) {
|
if(created) {
|
||||||
gl4es_glDeleteTextures(1, &texture);
|
gl4es_glDeleteTextures(1, &texture);
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
#include "loader.h"
|
#include "loader.h"
|
||||||
#include "matrix.h"
|
#include "matrix.h"
|
||||||
#include "buffers.h"
|
#include "buffers.h"
|
||||||
|
#include "vgpu/shaderconv.h"
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#ifdef _WINBASE_
|
#ifdef _WINBASE_
|
||||||
#define GSM_CAST(c) ((LPFILETIME)c)
|
#define GSM_CAST(c) ((LPFILETIME)c)
|
||||||
|
@ -122,6 +122,7 @@ static inline void errorGL() { // next glGetError will be from GL
|
|||||||
glstate->type_error = 1; // will need to read glGetError...
|
glstate->type_error = 1; // will need to read glGetError...
|
||||||
}
|
}
|
||||||
static inline void errorShim(GLenum error) { // next glGetError will be "error" from gl4es
|
static inline void errorShim(GLenum error) { // next glGetError will be "error" from gl4es
|
||||||
|
DBG(LOGD(" -> error set: %d", error))
|
||||||
if(glstate->type_error && glstate->shim_error==GL_NO_ERROR)
|
if(glstate->type_error && glstate->shim_error==GL_NO_ERROR)
|
||||||
glstate->type_error = 1;
|
glstate->type_error = 1;
|
||||||
if(glstate->shim_error == GL_NO_ERROR)
|
if(glstate->shim_error == GL_NO_ERROR)
|
||||||
|
@ -425,11 +425,14 @@ void initialize_gl4es() {
|
|||||||
globals4es.nointovlhack = 1;
|
globals4es.nointovlhack = 1;
|
||||||
SHUT_LOGD("MobileGlues-gl4es: No hack in shader converter to define overloaded function with int\n");
|
SHUT_LOGD("MobileGlues-gl4es: No hack in shader converter to define overloaded function with int\n");
|
||||||
}
|
}
|
||||||
|
globals4es.nointovlhack = 1;
|
||||||
if(GL4ES_IsEnvVarTrue("LIBGL_NOSHADERLOD")) {
|
if(GL4ES_IsEnvVarTrue("LIBGL_NOSHADERLOD")) {
|
||||||
globals4es.noshaderlod = 1;
|
globals4es.noshaderlod = 1;
|
||||||
SHUT_LOGD("MobileGlues-gl4es: No GL_EXT_shader_texture_lod used even if present\n");
|
SHUT_LOGD("MobileGlues-gl4es: No GL_EXT_shader_texture_lod used even if present\n");
|
||||||
hardext.shaderlod=0;
|
hardext.shaderlod=0;
|
||||||
}
|
}
|
||||||
|
hardext.shaderlod=0;
|
||||||
|
globals4es.noshaderlod = 1;
|
||||||
|
|
||||||
int env_begin_end;
|
int env_begin_end;
|
||||||
if(GL4ES_GetEnvVarInt("LIBGL_BEGINEND",&env_begin_end,0)) {
|
if(GL4ES_GetEnvVarInt("LIBGL_BEGINEND",&env_begin_end,0)) {
|
||||||
@ -618,7 +621,7 @@ void initialize_gl4es() {
|
|||||||
env(LIBGL_SHADERNOGLES, globals4es.shadernogles, "Remove GLES part in shader");
|
env(LIBGL_SHADERNOGLES, globals4es.shadernogles, "Remove GLES part in shader");
|
||||||
env(LIBGL_NOES2COMPAT, globals4es.noes2, "Don't expose GLX_EXT_create_context_es2_profile extension");
|
env(LIBGL_NOES2COMPAT, globals4es.noes2, "Don't expose GLX_EXT_create_context_es2_profile extension");
|
||||||
env(LIBGL_NORMALIZE, globals4es.normalize, "Force normals to be normalized on FPE shaders");
|
env(LIBGL_NORMALIZE, globals4es.normalize, "Force normals to be normalized on FPE shaders");
|
||||||
|
globals4es.normalize=1;
|
||||||
globals4es.dbgshaderconv=GL4ES_ReturnEnvVarIntDef("LIBGL_DBGSHADERCONV",0);
|
globals4es.dbgshaderconv=GL4ES_ReturnEnvVarIntDef("LIBGL_DBGSHADERCONV",0);
|
||||||
if(globals4es.dbgshaderconv) {
|
if(globals4es.dbgshaderconv) {
|
||||||
if(globals4es.dbgshaderconv==1)
|
if(globals4es.dbgshaderconv==1)
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
#include "shaderconv.h"
|
#include "shaderconv.h"
|
||||||
#include "fpe_shader.h"
|
#include "fpe_shader.h"
|
||||||
|
|
||||||
//#define DEBUG
|
#define DEBUG
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
#define DBG(a) a
|
#define DBG(a) a
|
||||||
#else
|
#else
|
||||||
@ -46,11 +46,12 @@ void APIENTRY_GL4ES gl4es_glAttachShader(GLuint program, GLuint shader) {
|
|||||||
// send to hadware
|
// send to hadware
|
||||||
LOAD_GLES2(glAttachShader);
|
LOAD_GLES2(glAttachShader);
|
||||||
if(gl4es_gles_glAttachShader) {
|
if(gl4es_gles_glAttachShader) {
|
||||||
if(strstr((glshader->converted)?glshader->converted:glshader->source, "FPE")!=NULL) {
|
if(glshader->is_gl4es_conv_shader) {
|
||||||
gl4es_gles_glAttachShader(glprogram->id, glshader->id);
|
// gl4es_gles_glAttachShader(glprogram->id, glshader->id);
|
||||||
|
gl4es_gles_glAttachShader(program, glshader->id);
|
||||||
|
// use fronted program id?
|
||||||
}
|
}
|
||||||
|
|
||||||
{} //STUB of gl4es_gles_glAttachShader(glprogram->id, glshader->id);
|
|
||||||
errorGL();
|
errorGL();
|
||||||
} else
|
} else
|
||||||
noerrorShim();
|
noerrorShim();
|
||||||
@ -795,10 +796,8 @@ void APIENTRY_GL4ES gl4es_glLinkProgram(GLuint program) {
|
|||||||
if(gl4es_gles_glLinkProgram) {
|
if(gl4es_gles_glLinkProgram) {
|
||||||
LOAD_GLES(glGetError);
|
LOAD_GLES(glGetError);
|
||||||
LOAD_GLES2(glGetProgramiv);
|
LOAD_GLES2(glGetProgramiv);
|
||||||
if(strstr((glprogram->last_vert->converted)?glprogram->last_vert->converted:glprogram->last_vert->source, "FPE")!=NULL) {
|
|
||||||
gl4es_gles_glLinkProgram(glprogram->id);
|
gl4es_gles_glLinkProgram(glprogram->id);
|
||||||
}
|
|
||||||
{} //STUB of gl4es_gles_glLinkProgram(glprogram->id);
|
|
||||||
GLenum err = gl4es_gles_glGetError();
|
GLenum err = gl4es_gles_glGetError();
|
||||||
// Get Link Status
|
// Get Link Status
|
||||||
gl4es_gles_glGetProgramiv(glprogram->id, GL_LINK_STATUS, &glprogram->linked);
|
gl4es_gles_glGetProgramiv(glprogram->id, GL_LINK_STATUS, &glprogram->linked);
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
#include "loader.h"
|
#include "loader.h"
|
||||||
#include "shaderconv.h"
|
#include "shaderconv.h"
|
||||||
|
|
||||||
//#define DEBUG
|
#define DEBUG
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
#define DBG(a) a
|
#define DBG(a) a
|
||||||
#else
|
#else
|
||||||
@ -110,7 +110,8 @@ void APIENTRY_GL4ES gl4es_glDeleteShader(GLuint shader) {
|
|||||||
LOAD_GLES2(glDeleteShader);
|
LOAD_GLES2(glDeleteShader);
|
||||||
if(gl4es_gles_glDeleteShader) {
|
if(gl4es_gles_glDeleteShader) {
|
||||||
errorGL();
|
errorGL();
|
||||||
{} //STUB of gl4es_gles_glDeleteShader(shader);
|
if(glshader->is_gl4es_conv_shader)
|
||||||
|
gl4es_gles_glDeleteShader(shader);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -123,10 +124,8 @@ void APIENTRY_GL4ES gl4es_glCompileShader(GLuint shader) {
|
|||||||
glshader->compiled = 1;
|
glshader->compiled = 1;
|
||||||
LOAD_GLES2(glCompileShader);
|
LOAD_GLES2(glCompileShader);
|
||||||
if(gl4es_gles_glCompileShader) {
|
if(gl4es_gles_glCompileShader) {
|
||||||
{} //STUB of gl4es_gles_glCompileShader(glshader->id);
|
|
||||||
if(strstr((glshader->converted)?glshader->converted:glshader->source, "FPE")!=NULL) {
|
|
||||||
gl4es_gles_glCompileShader(glshader->id);
|
gl4es_gles_glCompileShader(glshader->id);
|
||||||
}
|
|
||||||
errorGL();
|
errorGL();
|
||||||
if(globals4es.logshader) {
|
if(globals4es.logshader) {
|
||||||
// get compile status and print shaders sources if compile fail...
|
// get compile status and print shaders sources if compile fail...
|
||||||
@ -178,9 +177,15 @@ void APIENTRY_GL4ES gl4es_glShaderSource(GLuint shader, GLsizei count, const GLc
|
|||||||
if(glstate->glsl->es2 && !strncmp(glshader->source, "#version 100", 12))
|
if(glstate->glsl->es2 && !strncmp(glshader->source, "#version 100", 12))
|
||||||
glshader->converted = strdup(glshader->source);
|
glshader->converted = strdup(glshader->source);
|
||||||
else
|
else
|
||||||
glshader->converted = ConvertShader(glshader->source, glshader->type==GL_VERTEX_SHADER?1:0, &glshader->need);
|
glshader->converted = strdup(ConvertShaderConditionally(glshader));
|
||||||
// send source to GLES2 hardware if any
|
// send source to GLES2 hardware if any
|
||||||
if(strstr((glshader->converted)?glshader->converted:glshader->source, "FPE")!=NULL) {
|
int getGLSLVersion(const char* glsl_code);
|
||||||
|
SHUT_LOGD("shader version: %d",getGLSLVersion(glshader->source))
|
||||||
|
SHUT_LOGD("\nshader source: %s\n",glshader->source)
|
||||||
|
glshader->is_gl4es_conv_shader=0;
|
||||||
|
if(getGLSLVersion(glshader->source) < 140 || strstr((glshader->converted)?glshader->converted:glshader->source, "FPE")!=NULL) {
|
||||||
|
glshader->is_gl4es_conv_shader=1;
|
||||||
|
SHUT_LOGD("\nconverted and used in gl4es:\n%s\n",glshader->converted);
|
||||||
gl4es_gles_glShaderSource(shader, 1, (const GLchar * const*)((glshader->converted)?(&glshader->converted):(&glshader->source)), NULL);
|
gl4es_gles_glShaderSource(shader, 1, (const GLchar * const*)((glshader->converted)?(&glshader->converted):(&glshader->source)), NULL);
|
||||||
}
|
}
|
||||||
errorGL();
|
errorGL();
|
||||||
@ -237,7 +242,7 @@ void redoShader(GLuint shader, shaderconv_need_t *need) {
|
|||||||
return;
|
return;
|
||||||
free(glshader->converted);
|
free(glshader->converted);
|
||||||
memcpy(&glshader->need, need, sizeof(shaderconv_need_t));
|
memcpy(&glshader->need, need, sizeof(shaderconv_need_t));
|
||||||
glshader->converted = ConvertShader(glshader->source, glshader->type==GL_VERTEX_SHADER?1:0, &glshader->need);
|
glshader->converted = ConvertShaderConditionally(glshader);
|
||||||
// send source to GLES2 hardware if any
|
// send source to GLES2 hardware if any
|
||||||
gl4es_gles_glShaderSource(shader, 1, (const GLchar * const*)((glshader->converted)?(&glshader->converted):(&glshader->source)), NULL);
|
gl4es_gles_glShaderSource(shader, 1, (const GLchar * const*)((glshader->converted)?(&glshader->converted):(&glshader->source)), NULL);
|
||||||
// recompile...
|
// recompile...
|
||||||
|
@ -35,6 +35,7 @@ struct shader_s {
|
|||||||
char* converted; // converted source (or null if nothing)
|
char* converted; // converted source (or null if nothing)
|
||||||
// shaderconv
|
// shaderconv
|
||||||
shaderconv_need_t need; // the varying need / provide of the shader
|
shaderconv_need_t need; // the varying need / provide of the shader
|
||||||
|
int is_gl4es_conv_shader;
|
||||||
}; // shader_t defined in oldprogram.h
|
}; // shader_t defined in oldprogram.h
|
||||||
|
|
||||||
KHASH_MAP_DECLARE_INT(shaderlist, struct shader_s *);
|
KHASH_MAP_DECLARE_INT(shaderlist, struct shader_s *);
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -4,7 +4,8 @@
|
|||||||
#include "gles.h"
|
#include "gles.h"
|
||||||
#include "program.h"
|
#include "program.h"
|
||||||
|
|
||||||
char* ConvertShader(const char* pBuffer, int isVertex, shaderconv_need_t *need);
|
char * ConvertShaderConditionally(struct shader_s * shader_source);
|
||||||
|
char* ConvertShader(const char* pBuffer, int isVertex, shaderconv_need_t *need, int forwardPort);
|
||||||
|
|
||||||
int isBuiltinAttrib(const char* name);
|
int isBuiltinAttrib(const char* name);
|
||||||
int isBuiltinMatrix(const char* name);
|
int isBuiltinMatrix(const char* name);
|
||||||
|
@ -8,6 +8,67 @@ const char* AllSeparators = " \t\n\r.,;()[]{}-<>+*/%&\\\"'^$=!:?";
|
|||||||
|
|
||||||
char* gl4es_resize_if_needed(char* pBuffer, int *size, int addsize);
|
char* gl4es_resize_if_needed(char* pBuffer, int *size, int addsize);
|
||||||
|
|
||||||
|
void AppendToEnd(char **str, const char *suffix) {
|
||||||
|
size_t len = strlen(*str);
|
||||||
|
size_t suffixLen = strlen(suffix);
|
||||||
|
char *newStr = (char *)malloc(len + suffixLen + 1);
|
||||||
|
if (newStr == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
strcpy(newStr, *str);
|
||||||
|
strcpy(newStr + len, suffix);
|
||||||
|
free(*str);
|
||||||
|
*str = newStr;
|
||||||
|
}
|
||||||
|
void InsertAtBeginning(char **str, const char *prefix) {
|
||||||
|
size_t len = strlen(*str);
|
||||||
|
size_t prefixLen = strlen(prefix);
|
||||||
|
char *newStr = (char *)malloc(len + prefixLen + 1);
|
||||||
|
strcpy(newStr, prefix);
|
||||||
|
strcpy(newStr + prefixLen, *str);
|
||||||
|
free(*str);
|
||||||
|
*str = newStr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
char * InplaceReplaceByIndex(char* pBuffer, int* size, const int startIndex, const int endIndex, const char* replacement)
|
||||||
|
{
|
||||||
|
//printf("BY INDEX: %s", replacement);
|
||||||
|
//printf("BY INDEX: %i", strlen(replacement));
|
||||||
|
int length_difference;
|
||||||
|
if(endIndex < startIndex)
|
||||||
|
length_difference = strlen(replacement) + (endIndex - startIndex);
|
||||||
|
else if(endIndex == startIndex)
|
||||||
|
length_difference = strlen(replacement) - 1; // The initial char gets replaced
|
||||||
|
else
|
||||||
|
length_difference = strlen(replacement) - (endIndex - startIndex); // Can be negative if repl is smaller
|
||||||
|
pBuffer = gl4es_resize_if_needed(pBuffer, size, length_difference);
|
||||||
|
//printf("BEFORE MOVING: \n%s", pBuffer);
|
||||||
|
// Move the end of the string
|
||||||
|
memmove(pBuffer + startIndex + strlen(replacement) , pBuffer + endIndex + 1, strlen(pBuffer) - endIndex + 1);
|
||||||
|
//printf("AFTER MOVING 1: \n%s", pBuffer);
|
||||||
|
// Insert the replacement
|
||||||
|
memcpy(pBuffer + startIndex, replacement, strlen(replacement));
|
||||||
|
//strncpy(pBuffer + startIndex, replacement, strlen(replacement));
|
||||||
|
//printf("AFTER MOVING 2: \n%s", pBuffer);
|
||||||
|
return pBuffer;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Insert the string at the index, pushing "every chars to the right"
|
||||||
|
* @param source The shader as a string
|
||||||
|
* @param sourceLength The ALLOCATED length of the shader
|
||||||
|
* @param insertPoint The index at which the string is inserted.
|
||||||
|
* @param insertedString The string to insert
|
||||||
|
* @return The shader as a string, maybe in a different memory location
|
||||||
|
*/
|
||||||
|
char * InplaceInsertByIndex(char * source, int *sourceLength, const int insertPoint, const char *insertedString){
|
||||||
|
int insertLength = strlen(insertedString);
|
||||||
|
source = gl4es_resize_if_needed(source, sourceLength, insertLength);
|
||||||
|
memmove(source + insertPoint + insertLength, source + insertPoint, strlen(source) - insertPoint + 1);
|
||||||
|
memcpy(source + insertPoint, insertedString, insertLength);
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
|
||||||
char* gl4es_inplace_replace(char* pBuffer, int* size, const char* S, const char* D)
|
char* gl4es_inplace_replace(char* pBuffer, int* size, const char* S, const char* D)
|
||||||
{
|
{
|
||||||
int lS = strlen(S), lD = strlen(D);
|
int lS = strlen(S), lD = strlen(D);
|
||||||
@ -129,13 +190,21 @@ char* gl4es_resize_if_needed(char* pBuffer, int *size, int addsize) {
|
|||||||
char* p = pBuffer;
|
char* p = pBuffer;
|
||||||
int newsize = strlen(pBuffer)+addsize+1;
|
int newsize = strlen(pBuffer)+addsize+1;
|
||||||
if (newsize>*size) {
|
if (newsize>*size) {
|
||||||
newsize += 100;
|
//newsize += 100;
|
||||||
p = (char*)realloc(pBuffer, newsize);
|
p = (char*)realloc(pBuffer, newsize);
|
||||||
*size=newsize;
|
*size=newsize;
|
||||||
}
|
}
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int isDigit(char value){
|
||||||
|
return (value >= '0' && value <= '9');
|
||||||
|
}
|
||||||
|
|
||||||
|
int isValidFunctionName(char value){
|
||||||
|
return ((value >= 'a' && value <= 'z') || (value >= 'A' && value <= 'Z') || (value == '_'));
|
||||||
|
}
|
||||||
|
|
||||||
char* gl4es_append(char* pBuffer, int* size, const char* S) {
|
char* gl4es_append(char* pBuffer, int* size, const char* S) {
|
||||||
char* p =pBuffer;
|
char* p =pBuffer;
|
||||||
p = gl4es_resize_if_needed(pBuffer, size, strlen(S));
|
p = gl4es_resize_if_needed(pBuffer, size, strlen(S));
|
||||||
@ -246,3 +315,24 @@ char* gl4es_inplace_replace_simple(char* pBuffer, int* size, const char* S, cons
|
|||||||
|
|
||||||
return pBuffer;
|
return pBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// for vgpu/shaderconv.c
|
||||||
|
const char* FindString(const char* pBuffer, const char* S) __attribute__((alias("gl4es_find_string")));
|
||||||
|
char* FindStringNC(char* pBuffer, const char* S) __attribute__((alias("gl4es_find_string_nc")));
|
||||||
|
int CountString(const char* pBuffer, const char* S) __attribute__((alias("gl4es_count_string")));
|
||||||
|
char* ResizeIfNeeded(char* pBuffer, int *size, int addsize) __attribute__((alias("gl4es_resize_if_needed")));
|
||||||
|
char* InplaceReplace(char* pBuffer, int* size, const char* S, const char* D) __attribute__((alias("gl4es_inplace_replace")));
|
||||||
|
char* Append(char* pBuffer, int* size, const char* S) __attribute__((alias("gl4es_append")));
|
||||||
|
char* InplaceInsert(char* pBuffer, const char* S, char* master, int* size) __attribute__((alias("gl4es_inplace_insert")));
|
||||||
|
char* GetLine(char* pBuffer, int num) __attribute__((alias("gl4es_getline")));
|
||||||
|
int CountLine(const char* pBuffer) __attribute__((alias("gl4es_countline")));
|
||||||
|
int GetLineFor(const char* pBuffer, const char* S) __attribute__((alias("gl4es_getline_for")));
|
||||||
|
char* StrNext(char *pBuffer, const char* S) __attribute__((alias("gl4es_str_next")));
|
||||||
|
char* NextStr(char* pBuffer) __attribute__((alias("gl4es_next_str")));
|
||||||
|
char* PrevStr(char* Str, char* pBuffer) __attribute__((alias("gl4es_prev_str")));
|
||||||
|
char* NextBlank(char* pBuffer) __attribute__((alias("gl4es_next_blank")));
|
||||||
|
char* NextLine(char* pBuffer) __attribute__((alias("gl4es_next_line")));
|
||||||
|
const char* GetNextStr(char* pBuffer) __attribute__((alias("gl4es_get_next_str")));
|
||||||
|
int CountStringSimple(char* pBuffer, const char* S) __attribute__((alias("gl4es_countstring_simple")));
|
||||||
|
char* InplaceReplaceSimple(char* pBuffer, int* size, const char* S, const char* D) __attribute__((alias("gl4es_inplace_replace_simple")));
|
@ -20,11 +20,40 @@ char* gl4es_prev_str(char* Str, char* pBuffer); // go to previous non "blank"
|
|||||||
char* gl4es_next_blank(char* pBuffer); // go to next "blank"
|
char* gl4es_next_blank(char* pBuffer); // go to next "blank"
|
||||||
char* gl4es_next_line(char* pBuffer); // go to next new line (crlf not included)
|
char* gl4es_next_line(char* pBuffer); // go to next new line (crlf not included)
|
||||||
|
|
||||||
|
|
||||||
const char* gl4es_get_next_str(char* pBuffer); // get a (static) copy of next str (until next separator), can be a simple number or separator also
|
const char* gl4es_get_next_str(char* pBuffer); // get a (static) copy of next str (until next separator), can be a simple number or separator also
|
||||||
|
|
||||||
// those function don't try to be smart with separators...
|
// those function don't try to be smart with separators...
|
||||||
int gl4es_countstring_simple(char* pBuffer, const char* S);
|
int gl4es_countstring_simple(char* pBuffer, const char* S);
|
||||||
char* gl4es_inplace_replace_simple(char* pBuffer, int* size, const char* S, const char* D);
|
char* gl4es_inplace_replace_simple(char* pBuffer, int* size, const char* S, const char* D);
|
||||||
|
|
||||||
|
// dare not to change their names into gl4es_xxx :(
|
||||||
|
int isDigit(char value);
|
||||||
|
int isValidFunctionName(char value);
|
||||||
|
void AppendToEnd(char **str, const char *suffix);
|
||||||
|
void InsertAtBeginning(char **str, const char *prefix);
|
||||||
|
|
||||||
|
char * InplaceReplaceByIndex(char* pBuffer, int* size, int startIndex, int endIndex, const char* replacement);
|
||||||
|
char * InplaceInsertByIndex(char * source, int *sourceLength, int insertPoint, const char *insertedString);
|
||||||
|
|
||||||
|
extern const char* FindString(const char* pBuffer, const char* S);
|
||||||
|
extern char* FindStringNC(char* pBuffer, const char* S);
|
||||||
|
extern int CountString(const char* pBuffer, const char* S);
|
||||||
|
extern char* ResizeIfNeeded(char* pBuffer, int *size, int addsize);
|
||||||
|
extern char* InplaceReplace(char* pBuffer, int* size, const char* S, const char* D);
|
||||||
|
extern char* Append(char* pBuffer, int* size, const char* S);
|
||||||
|
extern char* InplaceInsert(char* pBuffer, const char* S, char* master, int* size);
|
||||||
|
extern char* GetLine(char* pBuffer, int num);
|
||||||
|
extern int CountLine(const char* pBuffer);
|
||||||
|
extern int GetLineFor(const char* pBuffer, const char* S);
|
||||||
|
extern char* StrNext(char *pBuffer, const char* S);
|
||||||
|
extern char* NextStr(char* pBuffer);
|
||||||
|
extern char* PrevStr(char* Str, char* pBuffer);
|
||||||
|
extern char* NextBlank(char* pBuffer);
|
||||||
|
extern char* NextLine(char* pBuffer);
|
||||||
|
extern const char* GetNextStr(char* pBuffer);
|
||||||
|
extern int CountStringSimple(char* pBuffer, const char* S);
|
||||||
|
extern char* InplaceReplaceSimple(char* pBuffer, int* size, const char* S, const char* D);
|
||||||
|
|
||||||
|
|
||||||
#endif // _GL4ES_STRING_UTILS_H_
|
#endif // _GL4ES_STRING_UTILS_H_
|
||||||
|
@ -400,7 +400,7 @@ void APIENTRY_GL4ES gl4es_glTexParameterf(GLenum target, GLenum pname, GLfloat p
|
|||||||
gl4es_glTexParameterfv(target, pname, ¶m);
|
gl4es_glTexParameterfv(target, pname, ¶m);
|
||||||
}
|
}
|
||||||
void gl4es_glTexParameterf_real(GLenum target, GLenum pname, GLfloat param) {
|
void gl4es_glTexParameterf_real(GLenum target, GLenum pname, GLfloat param) {
|
||||||
DBG(SHUT_LOGD("MobileGlues-gl4es: glTexParameterfv(%s, %s, [%f(%s)...])\n", PrintEnum(target), PrintEnum(pname), params[0], PrintEnum(params[0]));)
|
DBG(SHUT_LOGD("MobileGlues-gl4es: glTexParameterfv(%s, %s, [%f(%s)...])\n", PrintEnum(target), PrintEnum(pname), param, PrintEnum(param));)
|
||||||
GLfloat* params = ¶m;
|
GLfloat* params = ¶m;
|
||||||
if(!glstate->list.pending) {
|
if(!glstate->list.pending) {
|
||||||
PUSH_IF_COMPILING(glTexParameterfv);
|
PUSH_IF_COMPILING(glTexParameterfv);
|
||||||
@ -462,7 +462,7 @@ void APIENTRY_GL4ES gl4es_glTexParameteri(GLenum target, GLenum pname, GLint par
|
|||||||
gl4es_glTexParameterfv(target, pname, &fparam);
|
gl4es_glTexParameterfv(target, pname, &fparam);
|
||||||
}
|
}
|
||||||
void gl4es_glTexParameteri_real(GLenum target, GLenum pname, GLint param) {
|
void gl4es_glTexParameteri_real(GLenum target, GLenum pname, GLint param) {
|
||||||
DBG(SHUT_LOGD("MobileGlues-gl4es: glTexParameterfv(%s, %s, [%f(%s)...])\n", PrintEnum(target), PrintEnum(pname), params[0], PrintEnum(params[0]));)
|
DBG(SHUT_LOGD("MobileGlues-gl4es: glTexParameterfv(%s, %s, [%f(%s)...])\n", PrintEnum(target), PrintEnum(pname), param, PrintEnum(param));)
|
||||||
if(!glstate->list.pending) {
|
if(!glstate->list.pending) {
|
||||||
GLfloat *params = ¶m;
|
GLfloat *params = ¶m;
|
||||||
PUSH_IF_COMPILING(glTexParameterfv);
|
PUSH_IF_COMPILING(glTexParameterfv);
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
#include <GLES3/gl32.h>
|
||||||
#include "uniform.h"
|
#include "uniform.h"
|
||||||
|
|
||||||
#include "../glx/hardext.h"
|
#include "../glx/hardext.h"
|
||||||
@ -227,6 +228,10 @@ void GoUniformiv(program_t *glprogram, GLint location, int size, int count, cons
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m = kh_value(glprogram->uniform, k);
|
m = kh_value(glprogram->uniform, k);
|
||||||
|
if(m->type == GL_FLOAT && count == 1) {
|
||||||
|
glUniform1f(location, (float)*value);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if(size != n_uniform(m->type) || !is_uniform_int(m->type) || count>m->size) {
|
if(size != n_uniform(m->type) || !is_uniform_int(m->type) || count>m->size) {
|
||||||
errorShim(GL_INVALID_OPERATION);
|
errorShim(GL_INVALID_OPERATION);
|
||||||
return;
|
return;
|
||||||
|
1358
src/main/cpp/gl/gl4es/gl/vgpu/shaderconv.c
Normal file
1358
src/main/cpp/gl/gl4es/gl/vgpu/shaderconv.c
Normal file
File diff suppressed because it is too large
Load Diff
47
src/main/cpp/gl/gl4es/gl/vgpu/shaderconv.h
Normal file
47
src/main/cpp/gl/gl4es/gl/vgpu/shaderconv.h
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
//
|
||||||
|
// Created by serpentspirale on 13/01/2022.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef UNTITLED_SHADERCONV_H
|
||||||
|
#define UNTITLED_SHADERCONV_H
|
||||||
|
|
||||||
|
#include "../shader.h"
|
||||||
|
|
||||||
|
char* ConvertShaderVgpu(struct shader_s* shader_source);
|
||||||
|
|
||||||
|
char * GLSLHeader(char* source);
|
||||||
|
char * RemoveConstInsideBlocks(char* source, int * sourceLength);
|
||||||
|
char * ForceIntegerArrayAccess(char* source, int * sourceLength);
|
||||||
|
char * CoerceIntToFloat(char * source, int * sourceLength);
|
||||||
|
char * ReplaceModOperator(char * source, int * sourceLength);
|
||||||
|
char * WrapIvecFunctions(char * source, int * sourceLength);
|
||||||
|
char * WrapFunction(char * source, int * sourceLength, char * functionName, char * wrapperFunctionName, char * wrapperFunction);
|
||||||
|
int FindPositionAfterDirectives(char * source);
|
||||||
|
int FindPositionAfterVersion(char * source);
|
||||||
|
char * ReplaceGLFragData(char * source, int * sourceLength);
|
||||||
|
char * ReplaceGLFragColor(char * source, int * sourceLength);
|
||||||
|
char * ReplaceVariableName(char * source, int * sourceLength, char * initialName, char* newName);
|
||||||
|
char * ReplaceFunctionName(char * source, int * sourceLength, char * initialName, char * finalName);
|
||||||
|
char * RemoveUnsupportedExtensions(char * source);
|
||||||
|
int doesShaderVersionContainsES(const char * source);
|
||||||
|
char *ReplacePrecisionQualifiers(char *source, int *sourceLength, int isVertex);
|
||||||
|
char * GetClosingTokens(char openingToken);
|
||||||
|
int isOpeningToken(char openingToken);
|
||||||
|
int GetClosingTokenPosition(const char * source, int initialTokenPosition);
|
||||||
|
int GetClosingTokenPositionTokenOverride(const char * source, int initialTokenPosition, char initialToken);
|
||||||
|
int GetNextTokenPosition(const char * source, int initialPosition, char token, const char * acceptedChars);
|
||||||
|
void GetNextWord(char *source, int startPoint, int * startWord, int * endWord);
|
||||||
|
unsigned long strstrPos(const char * haystack, const char * needle);
|
||||||
|
char * insertIntAtFunctionCall(char * source, int * sourceSize, const char * functionName, int argumentPosition);
|
||||||
|
char * InsertExtension(char * source, int * sourceLength, int insertPoint, const char * extension);
|
||||||
|
char * InsertExtensions(char *source, int *sourceLength);
|
||||||
|
int GetShaderVersion(const char * source);
|
||||||
|
char * ReplaceFragmentOut(char * source, int *sourceLength);
|
||||||
|
char * BackportConstArrays(char *source, int * sourceLength);
|
||||||
|
char * ExtractString(char * source, int startString, int endString);
|
||||||
|
char* ProcessSwitchCases(char* source, int* length);
|
||||||
|
|
||||||
|
|
||||||
|
char* GetOperandFromOperator(char* source, int operatorIndex, int rightOperand, int * limit);
|
||||||
|
|
||||||
|
#endif //UNTITLED_SHADERCONV_H
|
@ -424,23 +424,29 @@ void GetHardwareExtensions(int notest)
|
|||||||
hardext.vendor = VEND_ARM;
|
hardext.vendor = VEND_ARM;
|
||||||
else if(strstr(vendor, "Imagination Technologies"))
|
else if(strstr(vendor, "Imagination Technologies"))
|
||||||
hardext.vendor = VEND_IMGTEC;
|
hardext.vendor = VEND_IMGTEC;
|
||||||
if(hardext.esversion>1) {
|
|
||||||
if(testGLSL("#version 120", 1))
|
hardext.glsl120 = 0;
|
||||||
hardext.glsl120 = 1;
|
|
||||||
if(testGLSL("#version 300 es", 0))
|
|
||||||
hardext.glsl300es = 1;
|
hardext.glsl300es = 1;
|
||||||
if(testGLSL("#version 310 es", 1))
|
|
||||||
hardext.glsl310es = 1;
|
hardext.glsl310es = 1;
|
||||||
}
|
// TODO: Check gles caps
|
||||||
if(hardext.glsl120) {
|
|
||||||
SHUT_LOGD("MobileGlues-gl4es: GLSL 120 supported and used\n");
|
//if(hardext.esversion>1) {
|
||||||
}
|
// if(testGLSL("#version 120", 1))
|
||||||
if(hardext.glsl300es) {
|
// hardext.glsl120 = 1;
|
||||||
SHUT_LOGD("MobileGlues-gl4es: GLSL 300 es supported%s\n", (hardext.glsl120||hardext.glsl310es)?"":" and used");
|
// if(testGLSL("#version 300 es", 0))
|
||||||
}
|
// hardext.glsl300es = 1;
|
||||||
if(hardext.glsl310es) {
|
// if(testGLSL("#version 310 es", 1))
|
||||||
SHUT_LOGD("MobileGlues-gl4es: GLSL 310 es supported%s\n", hardext.glsl120?"":" and used");
|
// hardext.glsl310es = 1;
|
||||||
}
|
//}
|
||||||
|
//if(hardext.glsl120) {
|
||||||
|
// SHUT_LOGD("MobileGlues-gl4es: GLSL 120 supported and used\n");
|
||||||
|
//}
|
||||||
|
//if(hardext.glsl300es) {
|
||||||
|
// SHUT_LOGD("MobileGlues-gl4es: GLSL 300 es supported%s\n", (hardext.glsl120||hardext.glsl310es)?"":" and used");
|
||||||
|
//}
|
||||||
|
//if(hardext.glsl310es) {
|
||||||
|
// SHUT_LOGD("MobileGlues-gl4es: GLSL 310 es supported%s\n", hardext.glsl120?"":" and used");
|
||||||
|
//}
|
||||||
|
|
||||||
#ifndef NOEGL
|
#ifndef NOEGL
|
||||||
if(strstr(gl4es_egl_eglQueryString(eglDisplay, EGL_EXTENSIONS), "EGL_KHR_gl_colorspace")) {
|
if(strstr(gl4es_egl_eglQueryString(eglDisplay, EGL_EXTENSIONS), "EGL_KHR_gl_colorspace")) {
|
||||||
|
@ -32,13 +32,13 @@ NATIVE_FUNCTION_HEAD(void, glClearColor, GLfloat red, GLfloat green, GLfloat blu
|
|||||||
NATIVE_FUNCTION_HEAD(void, glClearDepthf, GLfloat d) NATIVE_FUNCTION_END_NO_RETURN(void, glClearDepthf, d)
|
NATIVE_FUNCTION_HEAD(void, glClearDepthf, GLfloat d) NATIVE_FUNCTION_END_NO_RETURN(void, glClearDepthf, d)
|
||||||
NATIVE_FUNCTION_HEAD(void, glClearStencil, GLint s) NATIVE_FUNCTION_END_NO_RETURN(void, glClearStencil, s)
|
NATIVE_FUNCTION_HEAD(void, glClearStencil, GLint s) NATIVE_FUNCTION_END_NO_RETURN(void, glClearStencil, s)
|
||||||
NATIVE_FUNCTION_HEAD(void, glColorMask, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) NATIVE_FUNCTION_END_NO_RETURN(void, glColorMask, red,green,blue,alpha)
|
NATIVE_FUNCTION_HEAD(void, glColorMask, GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha) NATIVE_FUNCTION_END_NO_RETURN(void, glColorMask, red,green,blue,alpha)
|
||||||
NATIVE_FUNCTION_HEAD(void, glCompileShader, GLuint shader) NATIVE_FUNCTION_END_NO_RETURN(void, glCompileShader, shader)
|
//NATIVE_FUNCTION_HEAD(void, glCompileShader, GLuint shader) NATIVE_FUNCTION_END_NO_RETURN(void, glCompileShader, shader)
|
||||||
NATIVE_FUNCTION_HEAD(void, glCompressedTexImage2D, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data) NATIVE_FUNCTION_END_NO_RETURN(void, glCompressedTexImage2D, target,level,internalformat,width,height,border,imageSize,data)
|
NATIVE_FUNCTION_HEAD(void, glCompressedTexImage2D, GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const void *data) NATIVE_FUNCTION_END_NO_RETURN(void, glCompressedTexImage2D, target,level,internalformat,width,height,border,imageSize,data)
|
||||||
NATIVE_FUNCTION_HEAD(void, glCompressedTexSubImage2D, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data) NATIVE_FUNCTION_END_NO_RETURN(void, glCompressedTexSubImage2D, target,level,xoffset,yoffset,width,height,format,imageSize,data)
|
NATIVE_FUNCTION_HEAD(void, glCompressedTexSubImage2D, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLsizei imageSize, const void *data) NATIVE_FUNCTION_END_NO_RETURN(void, glCompressedTexSubImage2D, target,level,xoffset,yoffset,width,height,format,imageSize,data)
|
||||||
//NATIVE_FUNCTION_HEAD(void, glCopyTexImage2D, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) NATIVE_FUNCTION_END_NO_RETURN(void, glCopyTexImage2D, target,level,internalformat,x,y,width,height,border)
|
//NATIVE_FUNCTION_HEAD(void, glCopyTexImage2D, GLenum target, GLint level, GLenum internalformat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border) NATIVE_FUNCTION_END_NO_RETURN(void, glCopyTexImage2D, target,level,internalformat,x,y,width,height,border)
|
||||||
//NATIVE_FUNCTION_HEAD(void, glCopyTexSubImage2D, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) NATIVE_FUNCTION_END_NO_RETURN(void, glCopyTexSubImage2D, target,level,xoffset,yoffset,x,y,width,height)
|
//NATIVE_FUNCTION_HEAD(void, glCopyTexSubImage2D, GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height) NATIVE_FUNCTION_END_NO_RETURN(void, glCopyTexSubImage2D, target,level,xoffset,yoffset,x,y,width,height)
|
||||||
NATIVE_FUNCTION_HEAD(GLuint, glCreateProgram) NATIVE_FUNCTION_END(GLuint, glCreateProgram)
|
//NATIVE_FUNCTION_HEAD(GLuint, glCreateProgram) NATIVE_FUNCTION_END(GLuint, glCreateProgram)
|
||||||
NATIVE_FUNCTION_HEAD(GLuint, glCreateShader, GLenum type) NATIVE_FUNCTION_END(GLuint, glCreateShader, type)
|
//NATIVE_FUNCTION_HEAD(GLuint, glCreateShader, GLenum type) NATIVE_FUNCTION_END(GLuint, glCreateShader, type)
|
||||||
NATIVE_FUNCTION_HEAD(void, glCullFace, GLenum mode) NATIVE_FUNCTION_END_NO_RETURN(void, glCullFace, mode)
|
NATIVE_FUNCTION_HEAD(void, glCullFace, GLenum mode) NATIVE_FUNCTION_END_NO_RETURN(void, glCullFace, mode)
|
||||||
//NATIVE_FUNCTION_HEAD(void, glDeleteBuffers, GLsizei n, const GLuint *buffers) NATIVE_FUNCTION_END_NO_RETURN(void, glDeleteBuffers, n,buffers)
|
//NATIVE_FUNCTION_HEAD(void, glDeleteBuffers, GLsizei n, const GLuint *buffers) NATIVE_FUNCTION_END_NO_RETURN(void, glDeleteBuffers, n,buffers)
|
||||||
NATIVE_FUNCTION_HEAD(void, glDeleteFramebuffers, GLsizei n, const GLuint *framebuffers) NATIVE_FUNCTION_END_NO_RETURN(void, glDeleteFramebuffers, n,framebuffers)
|
NATIVE_FUNCTION_HEAD(void, glDeleteFramebuffers, GLsizei n, const GLuint *framebuffers) NATIVE_FUNCTION_END_NO_RETURN(void, glDeleteFramebuffers, n,framebuffers)
|
||||||
|
@ -943,7 +943,7 @@ STUB_FUNCTION_HEAD(void, glEvaluateDepthValuesARB,void); STUB_FUNCTION_END_NO_RE
|
|||||||
//STUB_FUNCTION_HEAD(void, glGetObjectParameterfvARB, GLhandleARB obj, GLenum pname, GLfloat* params); STUB_FUNCTION_END_NO_RETURN(void, glGetObjectParameterfvARB,obj,pname,params)
|
//STUB_FUNCTION_HEAD(void, glGetObjectParameterfvARB, GLhandleARB obj, GLenum pname, GLfloat* params); STUB_FUNCTION_END_NO_RETURN(void, glGetObjectParameterfvARB,obj,pname,params)
|
||||||
//STUB_FUNCTION_HEAD(void, glGetObjectParameterivARB, GLhandleARB obj, GLenum pname, GLint* params); STUB_FUNCTION_END_NO_RETURN(void, glGetObjectParameterivARB,obj,pname,params)
|
//STUB_FUNCTION_HEAD(void, glGetObjectParameterivARB, GLhandleARB obj, GLenum pname, GLint* params); STUB_FUNCTION_END_NO_RETURN(void, glGetObjectParameterivARB,obj,pname,params)
|
||||||
STUB_FUNCTION_HEAD(void, glGetInfoLogARB, GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB* infoLog); STUB_FUNCTION_END_NO_RETURN(void, glGetInfoLogARB,obj,maxLength,length,infoLog)
|
STUB_FUNCTION_HEAD(void, glGetInfoLogARB, GLhandleARB obj, GLsizei maxLength, GLsizei* length, GLcharARB* infoLog); STUB_FUNCTION_END_NO_RETURN(void, glGetInfoLogARB,obj,maxLength,length,infoLog)
|
||||||
STUB_FUNCTION_HEAD(void, glGetAttachedObjectsARB, GLhandleARB containerObj, GLsizei maxCount, GLsizei* count, GLhandleARB* obj); STUB_FUNCTION_END_NO_RETURN(void, glGetAttachedObjectsARB,containerObj,maxCount,count,obj)
|
//STUB_FUNCTION_HEAD(void, ,glGetAttachedObjectsARB GLhandleARB containerObj, GLsizei maxCount, GLsizei* count, GLhandleARB* obj); STUB_FUNCTION_END_NO_RETURN(void, glGetAttachedObjectsARB,containerObj,maxCount,count,obj)
|
||||||
STUB_FUNCTION_HEAD(void, glNamedStringARB, GLenum type, GLint namelen, const GLchar* name, GLint stringlen, const GLchar* string); STUB_FUNCTION_END_NO_RETURN(void, glNamedStringARB,type,namelen,name,stringlen,string)
|
STUB_FUNCTION_HEAD(void, glNamedStringARB, GLenum type, GLint namelen, const GLchar* name, GLint stringlen, const GLchar* string); STUB_FUNCTION_END_NO_RETURN(void, glNamedStringARB,type,namelen,name,stringlen,string)
|
||||||
STUB_FUNCTION_HEAD(void, glDeleteNamedStringARB, GLint namelen, const GLchar* name); STUB_FUNCTION_END_NO_RETURN(void, glDeleteNamedStringARB,namelen,name)
|
STUB_FUNCTION_HEAD(void, glDeleteNamedStringARB, GLint namelen, const GLchar* name); STUB_FUNCTION_END_NO_RETURN(void, glDeleteNamedStringARB,namelen,name)
|
||||||
STUB_FUNCTION_HEAD(void, glCompileShaderIncludeARB, GLuint shader, GLsizei count, const GLchar* const*path, const GLint* length); STUB_FUNCTION_END_NO_RETURN(void, glCompileShaderIncludeARB,shader,count,path,length)
|
STUB_FUNCTION_HEAD(void, glCompileShaderIncludeARB, GLuint shader, GLsizei count, const GLchar* const*path, const GLint* length); STUB_FUNCTION_END_NO_RETURN(void, glCompileShaderIncludeARB,shader,count,path,length)
|
||||||
@ -1627,8 +1627,8 @@ STUB_FUNCTION_HEAD(void, glFogCoordfvEXT,const GLfloat* coord); STUB_FUNCTION_EN
|
|||||||
STUB_FUNCTION_HEAD(void, glFogCoorddEXT, GLdouble coord); STUB_FUNCTION_END_NO_RETURN(void, glFogCoorddEXT,coord)
|
STUB_FUNCTION_HEAD(void, glFogCoorddEXT, GLdouble coord); STUB_FUNCTION_END_NO_RETURN(void, glFogCoorddEXT,coord)
|
||||||
STUB_FUNCTION_HEAD(void, glFogCoorddvEXT,const GLdouble* coord); STUB_FUNCTION_END_NO_RETURN(void, glFogCoorddvEXT,coord)
|
STUB_FUNCTION_HEAD(void, glFogCoorddvEXT,const GLdouble* coord); STUB_FUNCTION_END_NO_RETURN(void, glFogCoorddvEXT,coord)
|
||||||
STUB_FUNCTION_HEAD(void, glFogCoordPointerEXT, GLenum type, GLsizei stride, const void* pointer); STUB_FUNCTION_END_NO_RETURN(void, glFogCoordPointerEXT,type,stride,pointer)
|
STUB_FUNCTION_HEAD(void, glFogCoordPointerEXT, GLenum type, GLsizei stride, const void* pointer); STUB_FUNCTION_END_NO_RETURN(void, glFogCoordPointerEXT,type,stride,pointer)
|
||||||
STUB_FUNCTION_HEAD(void, glFramebufferTexture1DEXT, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); STUB_FUNCTION_END_NO_RETURN(void, glFramebufferTexture1DEXT,target,attachment,textarget,texture,level)
|
//STUB_FUNCTION_HEAD(void, glFramebufferTexture1DEXT, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level); STUB_FUNCTION_END_NO_RETURN(void, glFramebufferTexture1DEXT,target,attachment,textarget,texture,level)
|
||||||
STUB_FUNCTION_HEAD(void, glFramebufferTexture3DEXT, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); STUB_FUNCTION_END_NO_RETURN(void, glFramebufferTexture3DEXT,target,attachment,textarget,texture,level,zoffset)
|
//STUB_FUNCTION_HEAD(void, glFramebufferTexture3DEXT, GLenum target, GLenum attachment, GLenum textarget, GLuint texture, GLint level, GLint zoffset); STUB_FUNCTION_END_NO_RETURN(void, glFramebufferTexture3DEXT,target,attachment,textarget,texture,level,zoffset)
|
||||||
STUB_FUNCTION_HEAD(void, glProgramEnvParameters4fvEXT, GLenum target, GLuint index, GLsizei count, const GLfloat* params); STUB_FUNCTION_END_NO_RETURN(void, glProgramEnvParameters4fvEXT,target,index,count,params)
|
STUB_FUNCTION_HEAD(void, glProgramEnvParameters4fvEXT, GLenum target, GLuint index, GLsizei count, const GLfloat* params); STUB_FUNCTION_END_NO_RETURN(void, glProgramEnvParameters4fvEXT,target,index,count,params)
|
||||||
STUB_FUNCTION_HEAD(void, glProgramLocalParameters4fvEXT, GLenum target, GLuint index, GLsizei count, const GLfloat* params); STUB_FUNCTION_END_NO_RETURN(void, glProgramLocalParameters4fvEXT,target,index,count,params)
|
STUB_FUNCTION_HEAD(void, glProgramLocalParameters4fvEXT, GLenum target, GLuint index, GLsizei count, const GLfloat* params); STUB_FUNCTION_END_NO_RETURN(void, glProgramLocalParameters4fvEXT,target,index,count,params)
|
||||||
//STUB_FUNCTION_HEAD(void, glBindFragDataLocationEXT, GLuint program, GLuint color, const GLchar* name); STUB_FUNCTION_END_NO_RETURN(void, glBindFragDataLocationEXT,program,color,name)
|
//STUB_FUNCTION_HEAD(void, glBindFragDataLocationEXT, GLuint program, GLuint color, const GLchar* name); STUB_FUNCTION_END_NO_RETURN(void, glBindFragDataLocationEXT,program,color,name)
|
||||||
|
@ -705,6 +705,11 @@ std::string process_uniform_declarations(const std::string& glslCode) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" char* process_uniform_declarations_for_c(char* glslCode) {
|
||||||
|
std::string glslCode_str(glslCode);
|
||||||
|
return strdup(process_uniform_declarations(glslCode_str).c_str());
|
||||||
|
}
|
||||||
|
|
||||||
std::string processOutColorLocations(const std::string& glslCode) {
|
std::string processOutColorLocations(const std::string& glslCode) {
|
||||||
const static std::regex pattern(R"(\n(out highp vec4 outColor)(\d+);)");
|
const static std::regex pattern(R"(\n(out highp vec4 outColor)(\d+);)");
|
||||||
const std::string replacement = "\nlayout(location=$2) $1$2;";
|
const std::string replacement = "\nlayout(location=$2) $1$2;";
|
||||||
@ -732,13 +737,7 @@ std::string GLSLtoGLSLES(const char* glsl_code, GLenum glsl_type, uint essl_vers
|
|||||||
}
|
}
|
||||||
|
|
||||||
int return_code = -1;
|
int return_code = -1;
|
||||||
//std::string converted = /*glsl_version<140? GLSLtoGLSLES_1(glsl_code, glsl_type, essl_version, return_code):*/GLSLtoGLSLES_2(glsl_code, glsl_type, essl_version, return_code);
|
std::string converted = /*glsl_version<140? GLSLtoGLSLES_1(glsl_code, glsl_type, essl_version, return_code):*/GLSLtoGLSLES_2(glsl_code, glsl_type, essl_version, return_code);
|
||||||
std::string converted;
|
|
||||||
if (glsl_version<140) {
|
|
||||||
converted = GLSLtoGLSLES_3(glsl_code, glsl_type, essl_version, return_code);
|
|
||||||
} else {
|
|
||||||
converted = GLSLtoGLSLES_2(glsl_code, glsl_type, essl_version, return_code);
|
|
||||||
}
|
|
||||||
if (return_code == 0 && !converted.empty()) {
|
if (return_code == 0 && !converted.empty()) {
|
||||||
converted = process_uniform_declarations(converted);
|
converted = process_uniform_declarations(converted);
|
||||||
Cache::get_instance().put(sha256_string.c_str(), converted.c_str());
|
Cache::get_instance().put(sha256_string.c_str(), converted.c_str());
|
||||||
@ -750,6 +749,7 @@ std::string GLSLtoGLSLES(const char* glsl_code, GLenum glsl_type, uint essl_vers
|
|||||||
|
|
||||||
std::string GLSLtoGLSLES_3(const char *glsl_code, GLenum glsl_type, uint essl_version, int& return_code) {
|
std::string GLSLtoGLSLES_3(const char *glsl_code, GLenum glsl_type, uint essl_version, int& return_code) {
|
||||||
LOG_W("Warning: use gl4es shaderconv to convert shader.")
|
LOG_W("Warning: use gl4es shaderconv to convert shader.")
|
||||||
|
/*
|
||||||
gl4es_code::GL4ES_shaderconv_need_t need;
|
gl4es_code::GL4ES_shaderconv_need_t need;
|
||||||
need.need_texcoord = -1;
|
need.need_texcoord = -1;
|
||||||
int shaderCompileStatus;
|
int shaderCompileStatus;
|
||||||
@ -775,6 +775,7 @@ std::string GLSLtoGLSLES_3(const char *glsl_code, GLenum glsl_type, uint essl_ve
|
|||||||
LOG_D("converted:\n%s", converted)
|
LOG_D("converted:\n%s", converted)
|
||||||
return_code = 0;
|
return_code = 0;
|
||||||
return std::string(converted);
|
return std::string(converted);
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string replace_line_starting_with(const std::string& glslCode, const std::string& starting, const std::string& substitution = "") {
|
std::string replace_line_starting_with(const std::string& glslCode, const std::string& starting, const std::string& substitution = "") {
|
||||||
|
@ -21,6 +21,6 @@ std::string GLSLtoGLSLES(const char *glsl_code, GLenum glsl_type, uint esversion
|
|||||||
std::string GLSLtoGLSLES_1(const char *glsl_code, GLenum glsl_type, uint esversion, int& return_code);
|
std::string GLSLtoGLSLES_1(const char *glsl_code, GLenum glsl_type, uint esversion, int& return_code);
|
||||||
std::string GLSLtoGLSLES_2(const char *glsl_code, GLenum glsl_type, uint essl_version, int& return_code);
|
std::string GLSLtoGLSLES_2(const char *glsl_code, GLenum glsl_type, uint essl_version, int& return_code);
|
||||||
std::string GLSLtoGLSLES_3(const char *glsl_code, GLenum glsl_type, uint essl_version, int& return_code);
|
std::string GLSLtoGLSLES_3(const char *glsl_code, GLenum glsl_type, uint essl_version, int& return_code);
|
||||||
int getGLSLVersion(const char* glsl_code);
|
extern "C" int getGLSLVersion(const char* glsl_code);
|
||||||
|
|
||||||
#endif
|
#endif
|
@ -12,7 +12,7 @@
|
|||||||
#include <cmath>
|
#include <cmath>
|
||||||
#include <clocale>
|
#include <clocale>
|
||||||
|
|
||||||
#define DEBUG 1
|
#define DEBUG 0
|
||||||
|
|
||||||
namespace gl4es_code {
|
namespace gl4es_code {
|
||||||
|
|
||||||
|
@ -88,10 +88,15 @@ void glBindFragDataLocation(GLuint program, GLuint color, const GLchar *name) {
|
|||||||
shaderInfo.frag_data_changed = 1;
|
shaderInfo.frag_data_changed = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" EXPORT GLuint glCreateProgram() {
|
||||||
|
LOG()
|
||||||
|
GLuint program = gl4es_glCreateProgram();
|
||||||
|
CHECK_GL_ERROR
|
||||||
|
return program;
|
||||||
|
}
|
||||||
|
|
||||||
void glLinkProgram(GLuint program) {
|
void glLinkProgram(GLuint program) {
|
||||||
LOG()
|
LOG()
|
||||||
GET_GL4ES_FUNC(void, glLinkProgram, GLuint program)
|
|
||||||
CALL_GL4ES_FUNC(glLinkProgram, program)
|
|
||||||
LOG_D("glLinkProgram(%d)", program)
|
LOG_D("glLinkProgram(%d)", program)
|
||||||
if (!shaderInfo.converted.empty() && shaderInfo.frag_data_changed) {
|
if (!shaderInfo.converted.empty() && shaderInfo.frag_data_changed) {
|
||||||
GLES.glShaderSource(shaderInfo.id, 1, (const GLchar * const*) &shaderInfo.frag_data_changed_converted, nullptr);
|
GLES.glShaderSource(shaderInfo.id, 1, (const GLchar * const*) &shaderInfo.frag_data_changed_converted, nullptr);
|
||||||
@ -111,7 +116,9 @@ void glLinkProgram(GLuint program) {
|
|||||||
shaderInfo.converted = "";
|
shaderInfo.converted = "";
|
||||||
shaderInfo.frag_data_changed_converted = nullptr;
|
shaderInfo.frag_data_changed_converted = nullptr;
|
||||||
shaderInfo.frag_data_changed = 0;
|
shaderInfo.frag_data_changed = 0;
|
||||||
GLES.glLinkProgram(program);
|
//GLES.glLinkProgram(program);
|
||||||
|
GET_GL4ES_FUNC(void, glLinkProgram, GLuint program)
|
||||||
|
CALL_GL4ES_FUNC(glLinkProgram, program)
|
||||||
|
|
||||||
CHECK_GL_ERROR
|
CHECK_GL_ERROR
|
||||||
}
|
}
|
||||||
@ -191,4 +198,13 @@ EXPORT GLint glGetProgramResourceLocationIndex(GLuint program, GLenum programInt
|
|||||||
}
|
}
|
||||||
EXPORT void glGetProgramResourceLocationIndexARB(GLuint program, GLenum programInterface, const char *name) __attribute__((alias("glGetProgramResourceLocationIndex")));
|
EXPORT void glGetProgramResourceLocationIndexARB(GLuint program, GLenum programInterface, const char *name) __attribute__((alias("glGetProgramResourceLocationIndex")));
|
||||||
|
|
||||||
|
EXPORT void glGetAttachedObjectsARB(GLhandleARB program, GLsizei maxCount, GLsizei* count, GLhandleARB* objects) {
|
||||||
|
if (program == 0 || glIsProgram(program) == GL_FALSE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
glGetAttachedShaders(program, maxCount, count, (GLuint*)objects);
|
||||||
|
}
|
||||||
|
|
||||||
|
EXPORT GLhandleARB glCreateProgramARB() { return glCreateProgram(); }
|
||||||
|
|
||||||
}
|
}
|
@ -40,10 +40,22 @@ bool is_direct_shader(const char *glsl)
|
|||||||
return es3_ability;
|
return es3_ability;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" EXPORT GLuint glCreateShader(GLenum type) {
|
||||||
|
LOG()
|
||||||
|
GLuint shader = gl4es_glCreateShader(type);
|
||||||
|
CHECK_GL_ERROR
|
||||||
|
return shader;
|
||||||
|
}
|
||||||
|
|
||||||
|
extern "C" EXPORT void glCompileShader(GLuint shader) {
|
||||||
|
LOG()
|
||||||
|
gl4es_glCompileShader(shader);
|
||||||
|
CHECK_GL_ERROR
|
||||||
|
}
|
||||||
|
|
||||||
void glShaderSource(GLuint shader, GLsizei count, const GLchar *const* string, const GLint *length) {
|
void glShaderSource(GLuint shader, GLsizei count, const GLchar *const* string, const GLint *length) {
|
||||||
LOG()
|
LOG()
|
||||||
GET_GL4ES_FUNC(void, glShaderSource, GLuint shader, GLsizei count, const GLchar *const* string, const GLint *length)
|
gl4es_glShaderSource(shader,count,string,length);
|
||||||
CALL_GL4ES_FUNC(glShaderSource, shader, count, string, length)
|
|
||||||
shaderInfo.id = 0;
|
shaderInfo.id = 0;
|
||||||
shaderInfo.converted = "";
|
shaderInfo.converted = "";
|
||||||
shaderInfo.frag_data_changed = 0;
|
shaderInfo.frag_data_changed = 0;
|
||||||
@ -69,6 +81,7 @@ void glShaderSource(GLuint shader, GLsizei count, const GLchar *const* string, c
|
|||||||
essl_src = glsl_src;
|
essl_src = glsl_src;
|
||||||
} else {
|
} else {
|
||||||
int glsl_version = getGLSLVersion(glsl_src.c_str());
|
int glsl_version = getGLSLVersion(glsl_src.c_str());
|
||||||
|
if (glsl_version < 140) { LOG_D("Shader won't be processed in mg shaderconv."); return; } // will be converted in gl4es
|
||||||
LOG_D("[INFO] [Shader] Shader source: ")
|
LOG_D("[INFO] [Shader] Shader source: ")
|
||||||
LOG_D("%s", glsl_src.c_str())
|
LOG_D("%s", glsl_src.c_str())
|
||||||
GLint shaderType;
|
GLint shaderType;
|
||||||
@ -87,9 +100,7 @@ void glShaderSource(GLuint shader, GLsizei count, const GLchar *const* string, c
|
|||||||
shaderInfo.converted = essl_src;
|
shaderInfo.converted = essl_src;
|
||||||
const char* s[] = { essl_src.c_str() };
|
const char* s[] = { essl_src.c_str() };
|
||||||
GLES.glShaderSource(shader, count, s, nullptr);
|
GLES.glShaderSource(shader, count, s, nullptr);
|
||||||
}
|
} else LOG_E("Failed to convert glsl.")
|
||||||
else
|
|
||||||
LOG_E("Failed to convert glsl.")
|
|
||||||
CHECK_GL_ERROR
|
CHECK_GL_ERROR
|
||||||
} else {
|
} else {
|
||||||
LOG_E("No GLES.glShaderSource")
|
LOG_E("No GLES.glShaderSource")
|
||||||
@ -209,6 +220,9 @@ EXPORT void glVertexAttrib4ubvARB(GLuint index, const GLubyte *v) { glVertexAttr
|
|||||||
EXPORT void glVertexAttrib4usvARB(GLuint index, const GLushort *v) { glVertexAttrib4fv(index, (GLfloat*)v); }
|
EXPORT void glVertexAttrib4usvARB(GLuint index, const GLushort *v) { glVertexAttrib4fv(index, (GLfloat*)v); }
|
||||||
EXPORT void glVertexAttrib4uivARB(GLuint index, const GLuint *v) { glVertexAttrib4fv(index, (GLfloat*)v); }
|
EXPORT void glVertexAttrib4uivARB(GLuint index, const GLuint *v) { glVertexAttrib4fv(index, (GLfloat*)v); }
|
||||||
|
|
||||||
|
EXPORT void glCompileShaderARB(GLhandleARB shader) { glCompileShader(shader); }
|
||||||
|
EXPORT GLhandleARB glCreateShaderARB(GLenum shaderType) { return glCreateShader(shaderType); }
|
||||||
|
|
||||||
//EXPORT void glVertexAttribPointerARB(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer) {
|
//EXPORT void glVertexAttribPointerARB(GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer) {
|
||||||
// glVertexAttribPointer(index, size, type, normalized, stride, pointer);
|
// glVertexAttribPointer(index, size, type, normalized, stride, pointer);
|
||||||
//}
|
//}
|
||||||
|
@ -526,6 +526,8 @@ GL_FUNC_TYPEDEF(void, glMultiDrawArraysIndirectEXT, GLenum mode, const void *ind
|
|||||||
GL_FUNC_TYPEDEF(void, glMultiDrawElementsIndirectEXT, GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride)
|
GL_FUNC_TYPEDEF(void, glMultiDrawElementsIndirectEXT, GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride)
|
||||||
GL_FUNC_TYPEDEF(void, glBruh)
|
GL_FUNC_TYPEDEF(void, glBruh)
|
||||||
GL_FUNC_TYPEDEF(void, glMultiDrawElementsBaseVertexEXT, GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex)
|
GL_FUNC_TYPEDEF(void, glMultiDrawElementsBaseVertexEXT, GLenum mode, const GLsizei *count, GLenum type, const void *const*indices, GLsizei drawcount, const GLint *basevertex)
|
||||||
|
GL_FUNC_TYPEDEF(void, glFramebufferTexture3DOES, GLenum target, GLenum attachment, GLenum textarget,
|
||||||
|
GLuint texture, GLint level, GLint layer)
|
||||||
|
|
||||||
#define GL_FUNC_DECL(name) \
|
#define GL_FUNC_DECL(name) \
|
||||||
name##_PTR name;
|
name##_PTR name;
|
||||||
@ -903,6 +905,8 @@ struct gles_func_t {
|
|||||||
GL_FUNC_DECL(glMultiDrawElementsBaseVertexEXT)
|
GL_FUNC_DECL(glMultiDrawElementsBaseVertexEXT)
|
||||||
|
|
||||||
GL_FUNC_DECL(glBruh)
|
GL_FUNC_DECL(glBruh)
|
||||||
|
|
||||||
|
GL_FUNC_DECL(glFramebufferTexture3DOES)
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct gles_func_t g_gles_func;
|
extern struct gles_func_t g_gles_func;
|
||||||
|
@ -580,6 +580,8 @@ void init_target_gles() {
|
|||||||
INIT_GLES_FUNC(glMultiDrawArraysIndirectEXT)
|
INIT_GLES_FUNC(glMultiDrawArraysIndirectEXT)
|
||||||
INIT_GLES_FUNC(glMultiDrawElementsIndirectEXT)
|
INIT_GLES_FUNC(glMultiDrawElementsIndirectEXT)
|
||||||
INIT_GLES_FUNC(glMultiDrawElementsBaseVertexEXT)
|
INIT_GLES_FUNC(glMultiDrawElementsBaseVertexEXT)
|
||||||
|
|
||||||
|
INIT_GLES_FUNC(glFramebufferTexture3DOES)
|
||||||
// INIT_GLES_FUNC(glBruh)
|
// INIT_GLES_FUNC(glBruh)
|
||||||
|
|
||||||
LOG_D("glMultiDrawArraysIndirectEXT() @ 0x%x", GLES.glMultiDrawArraysIndirectEXT)
|
LOG_D("glMultiDrawArraysIndirectEXT() @ 0x%x", GLES.glMultiDrawArraysIndirectEXT)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user