This commit is contained in:
libretroadmin 2022-05-22 20:14:56 +02:00
parent a14ccc2d4d
commit 41d225f937

View File

@ -283,13 +283,14 @@ static void gl_glsl_print_linker_log(GLuint obj)
#if defined(ORBIS) #if defined(ORBIS)
void glPigletGetShaderBinarySCE(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, void* binary); void glPigletGetShaderBinarySCE(GLuint program, GLsizei bufSize, GLsizei* length, GLenum* binaryFormat, void* binary);
static const XXH64_hash_t gl_glsl_hash_shader(const char **source, const int source_length) static const XXH64_hash_t gl_glsl_hash_shader(
const char **source, const int source_length)
{ {
int n; int n;
XXH64_state_t* const state = XXH64_createState(); XXH64_state_t* const state = XXH64_createState();
XXH64_reset(state, 0xAABBCCDDu); XXH64_reset(state, 0xAABBCCDDu);
for(n=0; n<source_length; n++) for(n = 0; n < source_length; n++)
{ {
XXH64_update(state, source[n], strlen(source[n])); XXH64_update(state, source[n], strlen(source[n]));
} }
@ -303,61 +304,55 @@ static const XXH64_hash_t gl_glsl_hash_shader(const char **source, const int sou
static bool gl_glsl_load_binary_shader(GLuint shader, char *save_path) static bool gl_glsl_load_binary_shader(GLuint shader, char *save_path)
{ {
FILE * shader_binary;
GLsizei shader_size; GLsizei shader_size;
GLint status; GLint status;
FILE *shader_binary = fopen(save_path, "rb" );
shader_binary = fopen(save_path, "rb" ); if(shader_binary)
if( shader_binary != NULL)
{ {
printf("[ShaderDumper] Reading shader dump ... %s\n", save_path); char *shader_data = NULL;
fseek (shader_binary, 0, SEEK_END); // non-portable fseek (shader_binary, 0, SEEK_END);
shader_size=ftell (shader_binary); shader_size=ftell (shader_binary);
fseek(shader_binary, 0, SEEK_SET); fseek(shader_binary, 0, SEEK_SET);
char * shader_data = malloc(shader_size); shader_data = malloc(shader_size);
fread(shader_data, shader_size, 1, shader_binary); fread(shader_data, shader_size, 1, shader_binary);
fclose(shader_binary); fclose(shader_binary);
glShaderBinary(1, &shader, 2, shader_data, shader_size); glShaderBinary(1, &shader, 2, shader_data, shader_size);
free(shader_data); free(shader_data);
glGetShaderiv(shader, GL_COMPILE_STATUS, &status); glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
printf("GL_COMPILE_STATUS %x\n", status);
return status == GL_TRUE; return status == GL_TRUE;
} }
return false; return false;
} }
#if 0
static void gl_glsl_dump_shader(GLuint shader, char *save_path) static void gl_glsl_dump_shader(GLuint shader, char *save_path)
{ {
GLint length; FILE * fShader;
GLint length;
GLenum format;
GLsizei shader_size;
GLsizei bufferSize;
void *shaderBinary = NULL;
glGetShaderiv(shader, 0x8b89, &length); glGetShaderiv(shader, 0x8b89, &length);
printf("[gl_glsl_compile_shader]: Shader Binary Length: %x\n", length);
GLsizei bufferSize = length; bufferSize = length;
void* shaderBinary = malloc(bufferSize); shaderBinary = malloc(bufferSize);
printf("[ShaderDumper] Starting shader dump ... %s\n", save_path); memset(shaderBinary, 0, bufferSize);
memset(shaderBinary, 0, bufferSize); glPigletGetShaderBinarySCE(shader, bufferSize, &shader_size, &format, shaderBinary);
GLsizei shader_size; fShader = fopen(save_path, "wb");
GLenum format; fwrite(shaderBinary, shader_size, 1, fShader);
fclose(fShader);
glPigletGetShaderBinarySCE(shader, bufferSize, &shader_size, &format, shaderBinary);
FILE * fShader = fopen(save_path, "wb");
fwrite(shaderBinary, shader_size, 1, fShader);
fclose(fShader);
} }
#endif
#endif #endif
static bool gl_glsl_compile_shader(glsl_shader_data_t *glsl, static bool gl_glsl_compile_shader(glsl_shader_data_t *glsl,
@ -374,23 +369,26 @@ static bool gl_glsl_compile_shader(glsl_shader_data_t *glsl,
if (existing_version) if (existing_version)
{ {
const char* version_extra = ""; const char* version_extra = "";
unsigned version_no = (unsigned)strtoul(existing_version + 8, (char**)&program, 10); unsigned version_no = (unsigned)
strtoul(existing_version + 8, (char**)&program, 10);
#ifdef HAVE_OPENGLES #ifdef HAVE_OPENGLES
if (version_no < 130) if (version_no < 130)
version_no = 100; version_no = 100;
else else
{ {
version_extra = " es"; version_extra = " es";
version_no = 300; version_no = 300;
} }
#endif #endif
snprintf(version, sizeof(version), "#version %u%s\n", version_no, version_extra); snprintf(version,
sizeof(version), "#version %u%s\n", version_no, version_extra);
RARCH_LOG("[GLSL]: Using GLSL version %u%s.\n", version_no, version_extra); RARCH_LOG("[GLSL]: Using GLSL version %u%s.\n", version_no, version_extra);
} }
else if (glsl_core) else if (glsl_core)
{ {
unsigned version_no = 0; unsigned version_no = 0;
unsigned gl_ver = glsl_major * 100 + glsl_minor * 10; unsigned gl_ver = glsl_major * 100 + glsl_minor * 10;
switch (gl_ver) switch (gl_ver)
{ {
@ -418,13 +416,15 @@ static bool gl_glsl_compile_shader(glsl_shader_data_t *glsl,
source[3] = program; source[3] = program;
#if defined(ORBIS) #if defined(ORBIS)
XXH64_hash_t const hash = gl_glsl_hash_shader(source, ARRAY_SIZE(source)); {
char save_path[250];
char save_path[250]; XXH64_hash_t const hash =
sprintf(save_path, "/data/retroarch/temp/%lx.sb", hash); gl_glsl_hash_shader(source, ARRAY_SIZE(source));
snprintf(save_path, sizeof(save_path),
if(gl_glsl_load_binary_shader(shader, save_path)) "/data/retroarch/temp/%lx.sb", hash);
return true; if(gl_glsl_load_binary_shader(shader, save_path))
return true;
}
#endif #endif
glShaderSource(shader, ARRAY_SIZE(source), source, NULL); glShaderSource(shader, ARRAY_SIZE(source), source, NULL);
@ -433,10 +433,11 @@ static bool gl_glsl_compile_shader(glsl_shader_data_t *glsl,
glGetShaderiv(shader, GL_COMPILE_STATUS, &status); glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
gl_glsl_print_shader_log(shader); gl_glsl_print_shader_log(shader);
#if 0
#if defined(ORBIS) #if defined(ORBIS)
if(status == GL_TRUE){ if(status == GL_TRUE)
gl_glsl_dump_shader(shader, save_path); gl_glsl_dump_shader(shader, save_path);
} #endif
#endif #endif
return status == GL_TRUE; return status == GL_TRUE;
@ -464,9 +465,10 @@ static bool gl_glsl_compile_program(
void *program_data, void *program_data,
struct shader_program_info *program_info) struct shader_program_info *program_info)
{ {
glsl_shader_data_t *glsl = (glsl_shader_data_t*)data; glsl_shader_data_t *glsl = (glsl_shader_data_t*)data;
struct shader_program_glsl_data *program = (struct shader_program_glsl_data*)program_data; struct shader_program_glsl_data *program =
GLuint prog = glCreateProgram(); (struct shader_program_glsl_data*)program_data;
GLuint prog = glCreateProgram();
if (!program) if (!program)
program = &glsl->prg[idx]; program = &glsl->prg[idx];
@ -496,7 +498,8 @@ static bool gl_glsl_compile_program(
RARCH_LOG("[GLSL]: Found GLSL fragment shader.\n"); RARCH_LOG("[GLSL]: Found GLSL fragment shader.\n");
program->fprg = glCreateShader(GL_FRAGMENT_SHADER); program->fprg = glCreateShader(GL_FRAGMENT_SHADER);
if (!gl_glsl_compile_shader(glsl, program->fprg, if (!gl_glsl_compile_shader(glsl, program->fprg,
"#define FRAGMENT\n#define PARAMETER_UNIFORM\n", program_info->fragment)) "#define FRAGMENT\n#define PARAMETER_UNIFORM\n",
program_info->fragment))
{ {
RARCH_ERR("Failed to compile fragment shader #%u\n", idx); RARCH_ERR("Failed to compile fragment shader #%u\n", idx);
goto error; goto error;
@ -566,13 +569,15 @@ static bool gl_glsl_load_source_path(struct video_shader_pass *pass,
if (nitems <= 0 || len <= 0) if (nitems <= 0 || len <= 0)
return false; return false;
gl_glsl_strip_parameter_pragmas(pass->source.string.vertex, "#pragma parameter"); gl_glsl_strip_parameter_pragmas(pass->source.string.vertex,
"#pragma parameter");
pass->source.string.fragment = strdup(pass->source.string.vertex); pass->source.string.fragment = strdup(pass->source.string.vertex);
return pass->source.string.fragment && pass->source.string.vertex; return pass->source.string.fragment && pass->source.string.vertex;
} }
static bool gl_glsl_compile_programs( static bool gl_glsl_compile_programs(
glsl_shader_data_t *glsl, struct shader_program_glsl_data *program) glsl_shader_data_t *glsl,
struct shader_program_glsl_data *program)
{ {
unsigned i; unsigned i;
@ -678,7 +683,8 @@ static INLINE void gl_glsl_set_attribs(glsl_shader_data_t *glsl,
glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ARRAY_BUFFER, 0);
} }
static void gl_glsl_clear_uniforms_frame(struct shader_uniforms_frame *frame) static void gl_glsl_clear_uniforms_frame(
struct shader_uniforms_frame *frame)
{ {
frame->texture = -1; frame->texture = -1;
frame->texture_size = -1; frame->texture_size = -1;