diff --git a/panwrap/panwrap-decoder.c b/panwrap/panwrap-decoder.c index 7f4ef38fc7c47861c7114c280d68af843917f438..04af0e141072269b757016503be92f010fa17bf4 100644 --- a/panwrap/panwrap-decoder.c +++ b/panwrap/panwrap-decoder.c @@ -15,6 +15,10 @@ #include "panwrap.h" #include #include +#include + +extern char* replace_fragment; +extern char* replace_vertex; static char *panwrap_job_type_name(enum mali_job_type type) { @@ -232,11 +236,28 @@ void panwrap_decode_vertex_or_tiler_job(const struct mali_job_descriptor_header if (meta_ptr) { meta = panwrap_fetch_gpu_mem(NULL, meta_ptr, sizeof(*meta)); + /* For testing the shader compiler infrastructure, panloader + * can replace shaders at runtime, configurable by + * environmental variables. */ + + char *replacement = h->job_type == JOB_TYPE_VERTEX ? + replace_vertex : replace_fragment; + + if (*replacement) { + /* TODO: Determine size and possibly allocate our own + * shader buffer */ + + FILE *fp = fopen(replacement, "rb"); + fread(meta->shader, 1, 64, fp); + fclose(fp); + } + panwrap_log("Shader blob: @ " MALI_PTR_FMT "\n", meta_ptr); panwrap_indent++; panwrap_log_hexdump( panwrap_fetch_gpu_mem(NULL, meta->shader, 832), 832); panwrap_indent--; + } else panwrap_log("\n"); diff --git a/panwrap/panwrap-syscall.c b/panwrap/panwrap-syscall.c index 0ab9c61f3500c7f5e530be36dcb9c3760e85f12a..55971b5a87b59f36121f699741cfc272dc43bc2d 100644 --- a/panwrap/panwrap-syscall.c +++ b/panwrap/panwrap-syscall.c @@ -111,9 +111,13 @@ static LIST_HEAD(mmaps); static bool step_mode; static long log_delay; +char* replace_fragment; +char* replace_vertex; PANLOADER_CONSTRUCTOR { step_mode = panwrap_parse_env_bool("PANWRAP_STEP_MODE", false); log_delay = panwrap_parse_env_long("PANWRAP_LOG_DELAY", 0); + replace_fragment = panwrap_parse_env_string("PANWRAP_REPLACE_FRAGMENT", ""); + replace_vertex = panwrap_parse_env_string("PANWRAP_REPLACE_VERTEX", ""); } #define LOCK() pthread_mutex_lock(&l); diff --git a/panwrap/panwrap-util.c b/panwrap/panwrap-util.c index d1cdd953b25317c3999ad380a3c379c37de14a32..62b71bb4b7bc92915cc2e9e32330ade5d935b8d4 100644 --- a/panwrap/panwrap-util.c +++ b/panwrap/panwrap-util.c @@ -279,6 +279,18 @@ panwrap_parse_env_long(const char *env, long def) return ret; } +char * +panwrap_parse_env_string(const char *env, char *def) +{ + const char *val = getenv(env); + + if (!val) + return def; + + return val; +} + + PANLOADER_CONSTRUCTOR { const char *env; diff --git a/panwrap/panwrap.h b/panwrap/panwrap.h index ff9b8e48e1edd7bda2dd9e0edcafd16bf5ffa70e..13190e73f51a0ee73211d9f586281f52c53dd038 100644 --- a/panwrap/panwrap.h +++ b/panwrap/panwrap.h @@ -47,6 +47,7 @@ void panwrap_log_hexdump_trimmed(const void *data, size_t size); bool panwrap_parse_env_bool(const char *env, bool def); long panwrap_parse_env_long(const char *env, long def); +char * panwrap_parse_env_string(const char *env, char *def); extern short panwrap_indent;