summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukasz Kostyra <l.kostyra@samsung.com>2020-12-22 17:14:55 +0100
committerLukasz Kostyra <l.kostyra@samsung.com>2021-01-07 17:40:54 +0100
commit70c95ad948c02f12572adae3c020dcb656beb365 (patch)
treee577092de0ba11bd29306fab638552ebf199653d
parentaef0e34edd8e4a5fe49eb53153b9c2cdf2c8e8e6 (diff)
downloademulator-yagl-70c95ad948c02f12572adae3c020dcb656beb365.tar.gz
emulator-yagl-70c95ad948c02f12572adae3c020dcb656beb365.tar.bz2
emulator-yagl-70c95ad948c02f12572adae3c020dcb656beb365.zip
Keep shader state cached for further analysis
Change-Id: I55dac1c67109bb867af39079def0bcb827b925ff
-rw-r--r--GLESv2/yagl_gles2_calls.c12
-rw-r--r--GLESv2/yagl_gles2_shader.c2
-rw-r--r--GLESv2/yagl_gles2_shader.h3
3 files changed, 10 insertions, 7 deletions
diff --git a/GLESv2/yagl_gles2_calls.c b/GLESv2/yagl_gles2_calls.c
index 75a4e13..1f3576c 100644
--- a/GLESv2/yagl_gles2_calls.c
+++ b/GLESv2/yagl_gles2_calls.c
@@ -1406,7 +1406,6 @@ YAGL_API void glShaderSource(GLuint shader, GLsizei count, const GLchar * const
if (have_strings) {
uint8_t *tmp_buff;
- struct yagl_glsl_state glsl_state;
int ret;
int patched_len = 0;
char *patched_source;
@@ -1428,16 +1427,16 @@ YAGL_API void glShaderSource(GLuint shader, GLsizei count, const GLchar * const
YAGL_LOG_TRACE("orig source = %s", tmp_buff);
- yagl_glsl_state_init(&glsl_state,
+ yagl_glsl_state_init(&shader_obj->state,
shader_obj->type,
(char*)tmp_buff,
total_length,
(ctx->base.base.client_api == yagl_client_api_gles3));
- ret = yagl_glsl_parse(&glsl_state);
+ ret = yagl_glsl_parse(&shader_obj->state);
- if ((ret == 0) && !glsl_state.have_error) {
- patched_source = yagl_glsl_state_get_output(&glsl_state,
+ if ((ret == 0) && !shader_obj->state.have_error) {
+ patched_source = yagl_glsl_state_get_output(&shader_obj->state,
&patched_len);
YAGL_LOG_TRACE("patched source = %s", patched_source);
@@ -1452,13 +1451,12 @@ YAGL_API void glShaderSource(GLuint shader, GLsizei count, const GLchar * const
/*
* Unable to parse source, pass as-is.
*/
+ YAGL_LOG_TRACE("unable to patch shader source, passed as-is");
yagl_gles2_shader_source(shader_obj,
(GLchar*)tmp_buff,
(GLchar*)tmp_buff,
total_length);
}
-
- yagl_glsl_state_cleanup(&glsl_state);
}
out:
diff --git a/GLESv2/yagl_gles2_shader.c b/GLESv2/yagl_gles2_shader.c
index 1ab6bbd..19f5548 100644
--- a/GLESv2/yagl_gles2_shader.c
+++ b/GLESv2/yagl_gles2_shader.c
@@ -45,6 +45,8 @@ static void yagl_gles2_shader_destroy(struct yagl_ref *ref)
yagl_host_glDeleteObjects(&shader->global_name, 1);
+ yagl_glsl_state_cleanup(&shader->state);
+
yagl_object_cleanup(&shader->base);
yagl_free(shader);
diff --git a/GLESv2/yagl_gles2_shader.h b/GLESv2/yagl_gles2_shader.h
index 2c50be5..6cfe8b1 100644
--- a/GLESv2/yagl_gles2_shader.h
+++ b/GLESv2/yagl_gles2_shader.h
@@ -36,6 +36,7 @@
#include "yagl_types.h"
#include "yagl_object.h"
+#include "yagl_glsl_state.h"
/*
* Programs and shaders share the same namespace,
@@ -61,6 +62,8 @@ struct yagl_gles2_shader
GLenum type;
GLchar *source;
+
+ struct yagl_glsl_state state; // for late analysis at draw calls
};
struct yagl_gles2_shader *yagl_gles2_shader_create(GLenum type);