summaryrefslogtreecommitdiffstats
path: root/src/gallium/drivers/etnaviv
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium/drivers/etnaviv')
-rw-r--r--src/gallium/drivers/etnaviv/etnaviv_compiler.c53
-rw-r--r--src/gallium/drivers/etnaviv/etnaviv_compiler.h7
-rw-r--r--src/gallium/drivers/etnaviv/etnaviv_compiler_cmdline.c22
-rw-r--r--src/gallium/drivers/etnaviv/etnaviv_shader.c18
4 files changed, 62 insertions, 38 deletions
diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler.c b/src/gallium/drivers/etnaviv/etnaviv_compiler.c
index be3838d777d..7552a8f9d23 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_compiler.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_compiler.c
@@ -54,6 +54,7 @@
#include "etnaviv_context.h"
#include "etnaviv_debug.h"
#include "etnaviv_disasm.h"
+#include "etnaviv_shader.h"
#include "etnaviv_uniforms.h"
#include "etnaviv_util.h"
@@ -2253,15 +2254,18 @@ copy_uniform_state_to_shader(struct etna_compile *c, struct etna_shader_variant
etna_set_shader_uniforms_dirty_flags(sobj);
}
-struct etna_shader_variant *
-etna_compile_shader(const struct etna_specs *specs,
- const struct tgsi_token *tokens)
+bool
+etna_compile_shader(struct etna_shader_variant *v)
{
/* Create scratch space that may be too large to fit on stack
*/
bool ret;
struct etna_compile *c;
- struct etna_shader_variant *shader;
+
+ if (unlikely(!v))
+ return false;
+
+ const struct etna_specs *specs = v->shader->specs;
struct tgsi_lowering_config lconfig = {
.lower_SCS = specs->has_sin_cos_sqrt,
@@ -2278,11 +2282,9 @@ etna_compile_shader(const struct etna_specs *specs,
c = CALLOC_STRUCT(etna_compile);
if (!c)
- return NULL;
+ return false;
- shader = CALLOC_STRUCT(etna_shader_variant);
- if (!shader)
- goto out;
+ const struct tgsi_token *tokens = v->shader->tokens;
c->specs = specs;
c->tokens = tgsi_transform_lowering(&lconfig, tokens, &c->info);
@@ -2412,30 +2414,27 @@ etna_compile_shader(const struct etna_specs *specs,
etna_compile_fill_in_labels(c);
ret = etna_compile_check_limits(c);
- if (!ret) {
- FREE(shader);
- shader = NULL;
+ if (!ret)
goto out;
- }
/* fill in output structure */
- shader->processor = c->info.processor;
- shader->code_size = c->inst_ptr * 4;
- shader->code = mem_dup(c->code, c->inst_ptr * 16);
- shader->num_loops = c->num_loops;
- shader->num_temps = c->next_free_native;
- shader->vs_pos_out_reg = -1;
- shader->vs_pointsize_out_reg = -1;
- shader->ps_color_out_reg = -1;
- shader->ps_depth_out_reg = -1;
- copy_uniform_state_to_shader(c, shader);
+ v->processor = c->info.processor;
+ v->code_size = c->inst_ptr * 4;
+ v->code = mem_dup(c->code, c->inst_ptr * 16);
+ v->num_loops = c->num_loops;
+ v->num_temps = c->next_free_native;
+ v->vs_pos_out_reg = -1;
+ v->vs_pointsize_out_reg = -1;
+ v->ps_color_out_reg = -1;
+ v->ps_depth_out_reg = -1;
+ copy_uniform_state_to_shader(c, v);
if (c->info.processor == PIPE_SHADER_VERTEX) {
- fill_in_vs_inputs(shader, c);
- fill_in_vs_outputs(shader, c);
+ fill_in_vs_inputs(v, c);
+ fill_in_vs_outputs(v, c);
} else if (c->info.processor == PIPE_SHADER_FRAGMENT) {
- fill_in_ps_inputs(shader, c);
- fill_in_ps_outputs(shader, c);
+ fill_in_ps_inputs(v, c);
+ fill_in_ps_outputs(v, c);
}
out:
@@ -2445,7 +2444,7 @@ out:
FREE(c->labels);
FREE(c);
- return shader;
+ return ret;
}
extern const char *tgsi_swizzle_names[];
diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler.h b/src/gallium/drivers/etnaviv/etnaviv_compiler.h
index 8de01264a9b..8582e305a07 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_compiler.h
+++ b/src/gallium/drivers/etnaviv/etnaviv_compiler.h
@@ -95,6 +95,9 @@ struct etna_shader_variant {
/* shader variants form a linked list */
struct etna_shader_variant *next;
+
+ /* replicated here to avoid passing extra ptrs everywhere */
+ struct etna_shader *shader;
};
struct etna_varying {
@@ -110,8 +113,8 @@ struct etna_shader_link_info {
struct etna_varying varyings[ETNA_NUM_INPUTS];
};
-struct etna_shader_variant *
-etna_compile_shader(const struct etna_specs *specs, const struct tgsi_token *tokens);
+bool
+etna_compile_shader(struct etna_shader_variant *shader);
void
etna_dump_shader(const struct etna_shader_variant *shader);
diff --git a/src/gallium/drivers/etnaviv/etnaviv_compiler_cmdline.c b/src/gallium/drivers/etnaviv/etnaviv_compiler_cmdline.c
index 48f74b84b98..035ee86f4be 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_compiler_cmdline.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_compiler_cmdline.c
@@ -38,6 +38,9 @@
#include "etnaviv_compiler.h"
#include "etnaviv_debug.h"
#include "etnaviv_internal.h"
+#include "etnaviv_shader.h"
+
+#include "util/u_memory.h"
static const struct etna_specs specs_gc2000 = {
.vs_need_z_div = 0,
@@ -98,10 +101,16 @@ main(int argc, char **argv)
const char *filename;
struct tgsi_token toks[65536];
struct tgsi_parse_context parse;
- struct etna_shader_variant *shader_obj;
+ struct etna_shader s = {};
void *ptr;
size_t size;
+ struct etna_shader_variant *v = CALLOC_STRUCT(etna_shader_variant);
+ if (!v) {
+ fprintf(stderr, "malloc failed!\n");
+ return 1;
+ }
+
etna_mesa_debug = ETNA_DBG_MSGS;
while (n < argc) {
@@ -134,13 +143,16 @@ main(int argc, char **argv)
tgsi_parse_init(&parse, toks);
- shader_obj = etna_compile_shader(&specs_gc2000, toks);
+ s.specs = &specs_gc2000;
+ s.tokens = toks;
+
+ v->shader = &s;
- if (shader_obj == NULL) {
+ if (!etna_compile_shader(v)) {
fprintf(stderr, "compiler failed!\n");
return 1;
}
- etna_dump_shader(shader_obj);
- etna_destroy_shader(shader_obj);
+ etna_dump_shader(v);
+ etna_destroy_shader(v);
}
diff --git a/src/gallium/drivers/etnaviv/etnaviv_shader.c b/src/gallium/drivers/etnaviv/etnaviv_shader.c
index 6996187871f..5035eaffde6 100644
--- a/src/gallium/drivers/etnaviv/etnaviv_shader.c
+++ b/src/gallium/drivers/etnaviv/etnaviv_shader.c
@@ -270,17 +270,27 @@ etna_shader_update_vertex(struct etna_context *ctx)
static struct etna_shader_variant *
create_variant(struct etna_shader *shader)
{
- struct etna_shader_variant *v;
+ struct etna_shader_variant *v = CALLOC_STRUCT(etna_shader_variant);
+ int ret;
- v = etna_compile_shader(shader->specs, shader->tokens);
- if (!v) {
- debug_error("compile failed!");
+ if (!v)
return NULL;
+
+ v->shader = shader;
+
+ ret = etna_compile_shader(v);
+ if (!ret) {
+ debug_error("compile failed!");
+ goto fail;
}
v->id = ++shader->variant_count;
return v;
+
+fail:
+ FREE(v);
+ return NULL;
}
static void *