Mesa (main): svga: add svga_compile_shader helper function
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Sat May 14 03:14:11 UTC 2022
Module: Mesa
Branch: main
Commit: 058823906ee1da6d47697f97ecab269a71f41780
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=058823906ee1da6d47697f97ecab269a71f41780
Author: Charmaine Lee <charmainel at vmware.com>
Date: Thu May 12 20:57:22 2022 -0700
svga: add svga_compile_shader helper function
This patch refactors common shader compilation code into a helper function
which will call the corresponding shader translation function according to
the shader IR type.
It also adds a function pointer for getting dummy shader for different
shader stages.
Reviewed-by: Neha Bhende <bhenden at vmware.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16501>
---
src/gallium/drivers/svga/svga_pipe_cs.c | 7 ++-
src/gallium/drivers/svga/svga_pipe_fs.c | 2 +
src/gallium/drivers/svga/svga_pipe_gs.c | 1 +
src/gallium/drivers/svga/svga_pipe_vs.c | 2 +
src/gallium/drivers/svga/svga_shader.c | 61 ++++++++++++++++++++++++
src/gallium/drivers/svga/svga_shader.h | 26 ++++++++++
src/gallium/drivers/svga/svga_state_cs.c | 36 +-------------
src/gallium/drivers/svga/svga_state_fs.c | 79 +++---------------------------
src/gallium/drivers/svga/svga_state_gs.c | 63 ++++++------------------
src/gallium/drivers/svga/svga_state_ts.c | 72 +---------------------------
src/gallium/drivers/svga/svga_state_vs.c | 82 ++++----------------------------
src/gallium/drivers/svga/svga_tgsi.c | 17 +++++++
src/gallium/drivers/svga/svga_tgsi.h | 4 ++
13 files changed, 150 insertions(+), 302 deletions(-)
diff --git a/src/gallium/drivers/svga/svga_pipe_cs.c b/src/gallium/drivers/svga/svga_pipe_cs.c
index 0c975552efd..7b2293863b7 100644
--- a/src/gallium/drivers/svga/svga_pipe_cs.c
+++ b/src/gallium/drivers/svga/svga_pipe_cs.c
@@ -61,12 +61,15 @@ svga_create_compute_state(struct pipe_context *pipe,
/* we need to keep a local copy of the tokens */
cs->base.tokens = tgsi_dup_tokens(templ->prog);
}
+ assert(templ->ir_type == PIPE_SHADER_IR_TGSI);
+ struct svga_shader *shader = &cs->base;
+ shader->id = svga->debug.shader_id++;
+ shader->type = templ->ir_type;
+ shader->stage = PIPE_SHADER_COMPUTE;
/* Collect shader basic info */
svga_tgsi_scan_shader(&cs->base);
- cs->base.id = svga->debug.shader_id++;
-
cs->shared_mem_size = templ->req_local_mem;
SVGA_STATS_TIME_POP(svga_sws(svga));
diff --git a/src/gallium/drivers/svga/svga_pipe_fs.c b/src/gallium/drivers/svga/svga_pipe_fs.c
index b2c4efd1ec3..57743de5618 100644
--- a/src/gallium/drivers/svga/svga_pipe_fs.c
+++ b/src/gallium/drivers/svga/svga_pipe_fs.c
@@ -63,6 +63,8 @@ svga_create_fs_state(struct pipe_context *pipe,
fs->generic_inputs = svga_get_generic_inputs_mask(&fs->base.tgsi_info);
+ fs->base.get_dummy_shader = svga_get_compiled_dummy_fragment_shader;
+
svga_remap_generics(fs->base.info.generic_inputs_mask,
fs->generic_remap_table);
diff --git a/src/gallium/drivers/svga/svga_pipe_gs.c b/src/gallium/drivers/svga/svga_pipe_gs.c
index 5c3cb829966..a22f5da96f1 100644
--- a/src/gallium/drivers/svga/svga_pipe_gs.c
+++ b/src/gallium/drivers/svga/svga_pipe_gs.c
@@ -61,6 +61,7 @@ svga_create_gs_state(struct pipe_context *pipe,
tmp.type = PIPE_SHADER_IR_TGSI;
tmp.tokens = gs->base.tokens;
+ gs->base.get_dummy_shader = svga_get_compiled_dummy_geometry_shader;
gs->draw_shader = draw_create_geometry_shader(svga->swtnl.draw, &tmp);
done:
diff --git a/src/gallium/drivers/svga/svga_pipe_vs.c b/src/gallium/drivers/svga/svga_pipe_vs.c
index 3f4baff4ce3..7f849d4dfc6 100644
--- a/src/gallium/drivers/svga/svga_pipe_vs.c
+++ b/src/gallium/drivers/svga/svga_pipe_vs.c
@@ -55,6 +55,8 @@ svga_create_vs_state(struct pipe_context *pipe,
if (!vs)
goto done;
+ vs->base.get_dummy_shader = svga_get_compiled_dummy_vertex_shader;
+
{
/* Need to do construct a new template in case we substituted a
* debug shader.
diff --git a/src/gallium/drivers/svga/svga_shader.c b/src/gallium/drivers/svga/svga_shader.c
index 3f2930c3b90..7f8621faaaa 100644
--- a/src/gallium/drivers/svga/svga_shader.c
+++ b/src/gallium/drivers/svga/svga_shader.c
@@ -947,3 +947,64 @@ svga_create_shader(struct pipe_context *pipe,
return shader;
}
+
+
+/**
+ * Helper function to compile a shader.
+ * Depending on the shader IR type, it calls the corresponding
+ * compile shader function.
+ */
+enum pipe_error
+svga_compile_shader(struct svga_context *svga,
+ struct svga_shader *shader,
+ const struct svga_compile_key *key,
+ struct svga_shader_variant **out_variant)
+{
+ struct svga_shader_variant *variant = NULL;
+ enum pipe_error ret = PIPE_ERROR;
+
+ if (shader->type == PIPE_SHADER_IR_TGSI) {
+ variant = svga_tgsi_compile_shader(svga, shader, key);
+ } else {
+ debug_printf("Unexpected nir shader\n");
+ assert(0);
+ }
+
+ if (variant == NULL) {
+ if (shader->get_dummy_shader != NULL) {
+ debug_printf("Failed to compile shader, using dummy shader.\n");
+ variant = shader->get_dummy_shader(svga, shader, key);
+ }
+ }
+ else if (svga_shader_too_large(svga, variant)) {
+ /* too big, use shader */
+ if (shader->get_dummy_shader != NULL) {
+ debug_printf("Shader too large (%u bytes), using dummy shader.\n",
+ (unsigned)(variant->nr_tokens
+ * sizeof(variant->tokens[0])));
+
+ /* Free the too-large variant */
+ svga_destroy_shader_variant(svga, variant);
+
+ /* Use simple pass-through shader instead */
+ variant = shader->get_dummy_shader(svga, shader, key);
+ }
+ }
+
+ if (variant == NULL)
+ return PIPE_ERROR;
+
+ ret = svga_define_shader(svga, variant);
+ if (ret != PIPE_OK) {
+ svga_destroy_shader_variant(svga, variant);
+ return ret;
+ }
+
+ *out_variant = variant;
+
+ /* insert variant at head of linked list */
+ variant->next = shader->variants;
+ shader->variants = variant;
+
+ return PIPE_OK;
+}
diff --git a/src/gallium/drivers/svga/svga_shader.h b/src/gallium/drivers/svga/svga_shader.h
index 377a009e0b7..ecc365634b8 100644
--- a/src/gallium/drivers/svga/svga_shader.h
+++ b/src/gallium/drivers/svga/svga_shader.h
@@ -371,6 +371,11 @@ struct svga_shader
/** Head of linked list of compiled variants */
struct svga_shader_variant *variants;
+ /* Get dummy shader variant */
+ struct svga_shader_variant *(*get_dummy_shader)(struct svga_context *,
+ struct svga_shader *,
+ const struct svga_compile_key *);
+
unsigned id; /**< for debugging only */
};
@@ -488,6 +493,12 @@ svga_create_shader(struct pipe_context *pipe,
enum pipe_shader_type stage,
unsigned len);
+enum pipe_error
+svga_compile_shader(struct svga_context *svga,
+ struct svga_shader *shader,
+ const struct svga_compile_key *key,
+ struct svga_shader_variant **out_variant);
+
enum pipe_error
svga_define_shader(struct svga_context *svga,
struct svga_shader_variant *variant);
@@ -604,5 +615,20 @@ svga_is_using_flat_shading(const struct svga_context *svga)
svga_fs_variant(svga->state.hw_draw.fs)->uses_flat_interp : FALSE;
}
+struct svga_shader_variant *
+svga_get_compiled_dummy_vertex_shader(struct svga_context *svga,
+ struct svga_shader *shader,
+ const struct svga_compile_key *key);
+
+
+struct svga_shader_variant *
+svga_get_compiled_dummy_fragment_shader(struct svga_context *svga,
+ struct svga_shader *shader,
+ const struct svga_compile_key *key);
+
+struct svga_shader_variant *
+svga_get_compiled_dummy_geometry_shader(struct svga_context *svga,
+ struct svga_shader *shader,
+ const struct svga_compile_key *key);
#endif /* SVGA_SHADER_H */
diff --git a/src/gallium/drivers/svga/svga_state_cs.c b/src/gallium/drivers/svga/svga_state_cs.c
index 8b73e16340f..bf1959a09a1 100644
--- a/src/gallium/drivers/svga/svga_state_cs.c
+++ b/src/gallium/drivers/svga/svga_state_cs.c
@@ -35,35 +35,6 @@
#include "svga_tgsi.h"
-/**
- * Translate TGSI shader into an svga shader variant.
- */
-static enum pipe_error
-compile_cs(struct svga_context *svga,
- struct svga_compute_shader *cs,
- const struct svga_compile_key *key,
- struct svga_shader_variant **out_variant)
-{
- struct svga_shader_variant *variant;
- enum pipe_error ret = PIPE_ERROR;
-
- variant = svga_tgsi_vgpu10_translate(svga, &cs->base, key,
- PIPE_SHADER_COMPUTE);
- if (!variant)
- return PIPE_ERROR;
-
- ret = svga_define_shader(svga, variant);
- if (ret != PIPE_OK) {
- svga_destroy_shader_variant(svga, variant);
- return ret;
- }
-
- *out_variant = variant;
-
- return PIPE_OK;
-}
-
-
/**
* Create compute shader compile key.
*/
@@ -128,14 +99,9 @@ emit_hw_cs(struct svga_context *svga, uint64_t dirty)
variant = svga_search_shader_key(&cs->base, &key);
if (!variant) {
- ret = compile_cs(svga, cs, &key, &variant);
+ ret = svga_compile_shader(svga, &cs->base, &key, &variant);
if (ret != PIPE_OK)
goto done;
-
- /* insert the new variant at head of linked list */
- assert(variant);
- variant->next = cs->base.variants;
- cs->base.variants = variant;
}
if (variant != svga->state.hw_draw.cs) {
diff --git a/src/gallium/drivers/svga/svga_state_fs.c b/src/gallium/drivers/svga/svga_state_fs.c
index 4ee2137751e..492a2cbdde0 100644
--- a/src/gallium/drivers/svga/svga_state_fs.c
+++ b/src/gallium/drivers/svga/svga_state_fs.c
@@ -80,31 +80,16 @@ get_dummy_fragment_shader(void)
}
-static struct svga_shader_variant *
-translate_fragment_program(struct svga_context *svga,
- const struct svga_fragment_shader *fs,
- const struct svga_compile_key *key)
-{
- if (svga_have_vgpu10(svga)) {
- return svga_tgsi_vgpu10_translate(svga, &fs->base, key,
- PIPE_SHADER_FRAGMENT);
- }
- else {
- return svga_tgsi_vgpu9_translate(svga, &fs->base, key,
- PIPE_SHADER_FRAGMENT);
- }
-}
-
-
/**
* Replace the given shader's instruction with a simple constant-color
* shader. We use this when normal shader translation fails.
*/
-static struct svga_shader_variant *
-get_compiled_dummy_shader(struct svga_context *svga,
- struct svga_fragment_shader *fs,
- const struct svga_compile_key *key)
+struct svga_shader_variant *
+svga_get_compiled_dummy_fragment_shader(struct svga_context *svga,
+ struct svga_shader *shader,
+ const struct svga_compile_key *key)
{
+ struct svga_fragment_shader *fs = (struct svga_fragment_shader *)shader;
const struct tgsi_token *dummy = get_dummy_fragment_shader();
struct svga_shader_variant *variant;
@@ -119,61 +104,11 @@ get_compiled_dummy_shader(struct svga_context *svga,
svga_remap_generics(fs->base.info.generic_inputs_mask,
fs->generic_remap_table);
- variant = translate_fragment_program(svga, fs, key);
+ variant = svga_tgsi_compile_shader(svga, shader, key);
return variant;
}
-/**
- * Translate TGSI shader into an svga shader variant.
- */
-static enum pipe_error
-compile_fs(struct svga_context *svga,
- struct svga_fragment_shader *fs,
- const struct svga_compile_key *key,
- struct svga_shader_variant **out_variant)
-{
- struct svga_shader_variant *variant;
- enum pipe_error ret = PIPE_ERROR;
-
- variant = translate_fragment_program(svga, fs, key);
- if (variant == NULL) {
- debug_printf("Failed to compile fragment shader,"
- " using dummy shader instead.\n");
- variant = get_compiled_dummy_shader(svga, fs, key);
- }
- else if (svga_shader_too_large(svga, variant)) {
- /* too big, use dummy shader */
- debug_printf("Shader too large (%u bytes),"
- " using dummy shader instead.\n",
- (unsigned) (variant->nr_tokens
- * sizeof(variant->tokens[0])));
- /* Free the too-large variant */
- svga_destroy_shader_variant(svga, variant);
- /* Use simple pass-through shader instead */
- variant = get_compiled_dummy_shader(svga, fs, key);
- }
-
- if (!variant) {
- return PIPE_ERROR;
- }
-
- ret = svga_define_shader(svga, variant);
- if (ret != PIPE_OK) {
- svga_destroy_shader_variant(svga, variant);
- return ret;
- }
-
- *out_variant = variant;
-
- /* insert variant at head of linked list */
- variant->next = fs->base.variants;
- fs->base.variants = variant;
-
- return PIPE_OK;
-}
-
-
/* SVGA_NEW_TEXTURE_BINDING
* SVGA_NEW_RAST
* SVGA_NEW_NEED_SWTNL
@@ -463,7 +398,7 @@ emit_hw_fs(struct svga_context *svga, uint64_t dirty)
variant = svga_search_shader_key(&fs->base, &key);
if (!variant) {
- ret = compile_fs(svga, fs, &key, &variant);
+ ret = svga_compile_shader(svga, &fs->base, &key, &variant);
if (ret != PIPE_OK)
goto done;
}
diff --git a/src/gallium/drivers/svga/svga_state_gs.c b/src/gallium/drivers/svga/svga_state_gs.c
index b7e2efe0542..1746ed2b7e0 100644
--- a/src/gallium/drivers/svga/svga_state_gs.c
+++ b/src/gallium/drivers/svga/svga_state_gs.c
@@ -48,54 +48,24 @@ get_dummy_geometry_shader(void)
}
-static struct svga_shader_variant *
-translate_geometry_program(struct svga_context *svga,
- const struct svga_geometry_shader *gs,
- const struct svga_compile_key *key)
-{
- assert(svga_have_vgpu10(svga));
- return svga_tgsi_vgpu10_translate(svga, &gs->base, key,
- PIPE_SHADER_GEOMETRY);
-}
-
-
-/**
- * Translate TGSI shader into an svga shader variant.
- */
-static enum pipe_error
-compile_gs(struct svga_context *svga,
- struct svga_geometry_shader *gs,
- const struct svga_compile_key *key,
- struct svga_shader_variant **out_variant)
+struct svga_shader_variant *
+svga_get_compiled_dummy_geometry_shader(struct svga_context *svga,
+ struct svga_shader *shader,
+ const struct svga_compile_key *key)
{
+ const struct tgsi_token *dummy = get_dummy_geometry_shader();
struct svga_shader_variant *variant;
- enum pipe_error ret = PIPE_ERROR;
-
- variant = translate_geometry_program(svga, gs, key);
- if (!variant) {
- /* some problem during translation, try the dummy shader */
- const struct tgsi_token *dummy = get_dummy_geometry_shader();
- if (!dummy) {
- return PIPE_ERROR_OUT_OF_MEMORY;
- }
- debug_printf("Failed to compile geometry shader, using dummy shader instead.\n");
- FREE((void *) gs->base.tokens);
- gs->base.tokens = dummy;
- variant = translate_geometry_program(svga, gs, key);
- if (!variant) {
- return PIPE_ERROR;
- }
- }
+ struct svga_geometry_shader *gs = (struct svga_geometry_shader *)shader;
- ret = svga_define_shader(svga, variant);
- if (ret != PIPE_OK) {
- svga_destroy_shader_variant(svga, variant);
- return ret;
- }
+ if (!dummy)
+ return NULL;
- *out_variant = variant;
+ FREE((void *) gs->base.tokens);
+ gs->base.tokens = dummy;
+ svga_tgsi_scan_shader(&gs->base);
+ variant = svga_tgsi_compile_shader(svga, shader, key);
- return PIPE_OK;
+ return variant;
}
@@ -199,14 +169,9 @@ emit_hw_gs(struct svga_context *svga, uint64_t dirty)
variant = svga_search_shader_key(&gs->base, &key);
if (!variant) {
- ret = compile_gs(svga, gs, &key, &variant);
+ ret = svga_compile_shader(svga, &gs->base, &key, &variant);
if (ret != PIPE_OK)
goto done;
-
- /* insert the new variant at head of linked list */
- assert(variant);
- variant->next = gs->base.variants;
- gs->base.variants = variant;
}
}
diff --git a/src/gallium/drivers/svga/svga_state_ts.c b/src/gallium/drivers/svga/svga_state_ts.c
index 763759065bd..92a14356c7a 100644
--- a/src/gallium/drivers/svga/svga_state_ts.c
+++ b/src/gallium/drivers/svga/svga_state_ts.c
@@ -33,35 +33,6 @@
#include "svga_shader.h"
-/**
- * Translate TGSI shader into an svga shader variant.
- */
-static enum pipe_error
-compile_tcs(struct svga_context *svga,
- struct svga_tcs_shader *tcs,
- const struct svga_compile_key *key,
- struct svga_shader_variant **out_variant)
-{
- struct svga_shader_variant *variant;
- enum pipe_error ret = PIPE_ERROR;
-
- variant = svga_tgsi_vgpu10_translate(svga, &tcs->base, key,
- PIPE_SHADER_TESS_CTRL);
- if (!variant)
- return PIPE_ERROR;
-
- ret = svga_define_shader(svga, variant);
- if (ret != PIPE_OK) {
- svga_destroy_shader_variant(svga, variant);
- return ret;
- }
-
- *out_variant = variant;
-
- return PIPE_OK;
-}
-
-
static void
make_tcs_key(struct svga_context *svga, struct svga_compile_key *key)
{
@@ -143,14 +114,9 @@ emit_hw_tcs(struct svga_context *svga, uint64_t dirty)
variant = svga_search_shader_key(&tcs->base, &key);
if (!variant) {
- ret = compile_tcs(svga, tcs, &key, &variant);
+ ret = svga_compile_shader(svga, &tcs->base, &key, &variant);
if (ret != PIPE_OK)
goto done;
-
- /* insert the new variant at head of linked list */
- assert(variant);
- variant->next = tcs->base.variants;
- tcs->base.variants = variant;
}
if (variant != svga->state.hw_draw.tcs) {
@@ -184,35 +150,6 @@ struct svga_tracked_state svga_hw_tcs =
};
-/**
- * Translate TGSI shader into an svga shader variant.
- */
-static enum pipe_error
-compile_tes(struct svga_context *svga,
- struct svga_tes_shader *tes,
- const struct svga_compile_key *key,
- struct svga_shader_variant **out_variant)
-{
- struct svga_shader_variant *variant;
- enum pipe_error ret = PIPE_ERROR;
-
- variant = svga_tgsi_vgpu10_translate(svga, &tes->base, key,
- PIPE_SHADER_TESS_EVAL);
- if (!variant)
- return PIPE_ERROR;
-
- ret = svga_define_shader(svga, variant);
- if (ret != PIPE_OK) {
- svga_destroy_shader_variant(svga, variant);
- return ret;
- }
-
- *out_variant = variant;
-
- return PIPE_OK;
-}
-
-
static void
make_tes_key(struct svga_context *svga, struct svga_compile_key *key)
{
@@ -345,14 +282,9 @@ emit_hw_tes(struct svga_context *svga, uint64_t dirty)
variant = svga_search_shader_key(&tes->base, &key);
if (!variant) {
- ret = compile_tes(svga, tes, &key, &variant);
+ ret = svga_compile_shader(svga, &tes->base, &key, &variant);
if (ret != PIPE_OK)
goto done;
-
- /* insert the new variant at head of linked list */
- assert(variant);
- variant->next = tes->base.variants;
- tes->base.variants = variant;
}
if (variant != svga->state.hw_draw.tes) {
diff --git a/src/gallium/drivers/svga/svga_state_vs.c b/src/gallium/drivers/svga/svga_state_vs.c
index 78015e117d3..62472950de5 100644
--- a/src/gallium/drivers/svga/svga_state_vs.c
+++ b/src/gallium/drivers/svga/svga_state_vs.c
@@ -70,31 +70,16 @@ get_dummy_vertex_shader(void)
}
-static struct svga_shader_variant *
-translate_vertex_program(struct svga_context *svga,
- const struct svga_vertex_shader *vs,
- const struct svga_compile_key *key)
-{
- if (svga_have_vgpu10(svga)) {
- return svga_tgsi_vgpu10_translate(svga, &vs->base, key,
- PIPE_SHADER_VERTEX);
- }
- else {
- return svga_tgsi_vgpu9_translate(svga, &vs->base, key,
- PIPE_SHADER_VERTEX);
- }
-}
-
-
/**
* Replace the given shader's instruction with a simple / dummy shader.
* We use this when normal shader translation fails.
*/
-static struct svga_shader_variant *
-get_compiled_dummy_vertex_shader(struct svga_context *svga,
- struct svga_vertex_shader *vs,
- const struct svga_compile_key *key)
+struct svga_shader_variant *
+svga_get_compiled_dummy_vertex_shader(struct svga_context *svga,
+ struct svga_shader *shader,
+ const struct svga_compile_key *key)
{
+ struct svga_vertex_shader *vs = (struct svga_vertex_shader *)shader;
const struct tgsi_token *dummy = get_dummy_vertex_shader();
struct svga_shader_variant *variant;
@@ -107,57 +92,11 @@ get_compiled_dummy_vertex_shader(struct svga_context *svga,
svga_tgsi_scan_shader(&vs->base);
- variant = translate_vertex_program(svga, vs, key);
+ variant = svga_tgsi_compile_shader(svga, shader, key);
return variant;
}
-/**
- * Translate TGSI shader into an svga shader variant.
- */
-static enum pipe_error
-compile_vs(struct svga_context *svga,
- struct svga_vertex_shader *vs,
- const struct svga_compile_key *key,
- struct svga_shader_variant **out_variant)
-{
- struct svga_shader_variant *variant;
- enum pipe_error ret = PIPE_ERROR;
-
- variant = translate_vertex_program(svga, vs, key);
- if (variant == NULL) {
- debug_printf("Failed to compile vertex shader,"
- " using dummy shader instead.\n");
- variant = get_compiled_dummy_vertex_shader(svga, vs, key);
- }
- else if (svga_shader_too_large(svga, variant)) {
- /* too big, use dummy shader */
- debug_printf("Shader too large (%u bytes),"
- " using dummy shader instead.\n",
- (unsigned) (variant->nr_tokens
- * sizeof(variant->tokens[0])));
- /* Free the too-large variant */
- svga_destroy_shader_variant(svga, variant);
- /* Use simple pass-through shader instead */
- variant = get_compiled_dummy_vertex_shader(svga, vs, key);
- }
-
- if (!variant) {
- return PIPE_ERROR;
- }
-
- ret = svga_define_shader(svga, variant);
- if (ret != PIPE_OK) {
- svga_destroy_shader_variant(svga, variant);
- return ret;
- }
-
- *out_variant = variant;
-
- return PIPE_OK;
-}
-
-
/* SVGA_NEW_PRESCALE, SVGA_NEW_RAST, SVGA_NEW_FS
*/
static void
@@ -329,7 +268,7 @@ compile_passthrough_vs(struct svga_context *svga,
memset(&key, 0, sizeof(key));
key.vs.undo_viewport = 1;
- ret = compile_vs(svga, &new_vs, &key, &variant);
+ ret = svga_compile_shader(svga, &new_vs.base, &key, &variant);
if (ret != PIPE_OK)
return ret;
@@ -393,15 +332,10 @@ emit_hw_vs(struct svga_context *svga, uint64_t dirty)
ret = compile_passthrough_vs(svga, vs, fs, &variant);
}
else {
- ret = compile_vs(svga, vs, &key, &variant);
+ ret = svga_compile_shader(svga, &vs->base, &key, &variant);
}
if (ret != PIPE_OK)
goto done;
-
- /* insert the new variant at head of linked list */
- assert(variant);
- variant->next = vs->base.variants;
- vs->base.variants = variant;
}
}
diff --git a/src/gallium/drivers/svga/svga_tgsi.c b/src/gallium/drivers/svga/svga_tgsi.c
index c9dc0ea01fa..33405e5834c 100644
--- a/src/gallium/drivers/svga/svga_tgsi.c
+++ b/src/gallium/drivers/svga/svga_tgsi.c
@@ -515,3 +515,20 @@ svga_tgsi_scan_shader(struct svga_shader *shader)
break;
}
}
+
+
+/**
+ * Compile a TGSI shader
+ */
+struct svga_shader_variant *
+svga_tgsi_compile_shader(struct svga_context *svga,
+ struct svga_shader *shader,
+ const struct svga_compile_key *key)
+{
+ if (svga_have_vgpu10(svga)) {
+ return svga_tgsi_vgpu10_translate(svga, shader, key, shader->stage);
+ }
+ else {
+ return svga_tgsi_vgpu9_translate(svga, shader, key, shader->stage);
+ }
+}
diff --git a/src/gallium/drivers/svga/svga_tgsi.h b/src/gallium/drivers/svga/svga_tgsi.h
index d41a2c4555d..af56bca3cad 100644
--- a/src/gallium/drivers/svga/svga_tgsi.h
+++ b/src/gallium/drivers/svga/svga_tgsi.h
@@ -79,4 +79,8 @@ boolean svga_shader_verify(const uint32_t *tokens, unsigned nr_tokens);
void
svga_tgsi_scan_shader(struct svga_shader *shader);
+struct svga_shader_variant *
+svga_tgsi_compile_shader(struct svga_context *svga,
+ struct svga_shader *shader,
+ const struct svga_compile_key *key);
#endif
More information about the mesa-commit
mailing list