summaryrefslogtreecommitdiffstats
path: root/src/gallium
diff options
context:
space:
mode:
Diffstat (limited to 'src/gallium')
-rw-r--r--src/gallium/state_trackers/nine/nine_shader.h10
-rw-r--r--src/gallium/state_trackers/nine/nine_state.c4
-rw-r--r--src/gallium/state_trackers/nine/nine_state.h2
-rw-r--r--src/gallium/state_trackers/nine/pixelshader9.c15
-rw-r--r--src/gallium/state_trackers/nine/pixelshader9.h3
-rw-r--r--src/gallium/state_trackers/nine/vertexshader9.c15
-rw-r--r--src/gallium/state_trackers/nine/vertexshader9.h3
7 files changed, 37 insertions, 15 deletions
diff --git a/src/gallium/state_trackers/nine/nine_shader.h b/src/gallium/state_trackers/nine/nine_shader.h
index 6eb97127b9c..aa0c0ab1f7a 100644
--- a/src/gallium/state_trackers/nine/nine_shader.h
+++ b/src/gallium/state_trackers/nine/nine_shader.h
@@ -118,22 +118,25 @@ struct nine_shader_variant
{
struct nine_shader_variant *next;
void *cso;
+ unsigned *const_ranges;
uint64_t key;
};
static inline void *
-nine_shader_variant_get(struct nine_shader_variant *list, uint64_t key)
+nine_shader_variant_get(struct nine_shader_variant *list, unsigned **const_ranges, uint64_t key)
{
while (list->key != key && list->next)
list = list->next;
- if (list->key == key)
+ if (list->key == key) {
+ *const_ranges = list->const_ranges;
return list->cso;
+ }
return NULL;
}
static inline boolean
nine_shader_variant_add(struct nine_shader_variant *list,
- uint64_t key, void *cso)
+ uint64_t key, void *cso, unsigned *const_ranges)
{
while (list->next) {
assert(list->key != key);
@@ -145,6 +148,7 @@ nine_shader_variant_add(struct nine_shader_variant *list,
list->next->next = NULL;
list->next->key = key;
list->next->cso = cso;
+ list->next->const_ranges = const_ranges;
return TRUE;
}
diff --git a/src/gallium/state_trackers/nine/nine_state.c b/src/gallium/state_trackers/nine/nine_state.c
index 76c25c8831a..6440cf46c93 100644
--- a/src/gallium/state_trackers/nine/nine_state.c
+++ b/src/gallium/state_trackers/nine/nine_state.c
@@ -603,7 +603,7 @@ prepare_vs(struct NineDevice9 *device, uint8_t shader_changed)
/* likely because we dislike FF */
if (likely(context->programmable_vs)) {
- context->cso_shader.vs = NineVertexShader9_GetVariant(vs);
+ context->cso_shader.vs = NineVertexShader9_GetVariant(vs, &context->cso_shader.vs_const_ranges);
} else {
vs = device->ff.vs;
context->cso_shader.vs = vs->ff_cso;
@@ -637,7 +637,7 @@ prepare_ps(struct NineDevice9 *device, uint8_t shader_changed)
return 0;
if (likely(ps)) {
- context->cso_shader.ps = NinePixelShader9_GetVariant(ps);
+ context->cso_shader.ps = NinePixelShader9_GetVariant(ps, &context->cso_shader.ps_const_ranges);
} else {
ps = device->ff.ps;
context->cso_shader.ps = ps->ff_cso;
diff --git a/src/gallium/state_trackers/nine/nine_state.h b/src/gallium/state_trackers/nine/nine_state.h
index 376dc561697..37238b85936 100644
--- a/src/gallium/state_trackers/nine/nine_state.h
+++ b/src/gallium/state_trackers/nine/nine_state.h
@@ -239,7 +239,9 @@ struct nine_context {
struct {
void *vs;
+ unsigned *vs_const_ranges;
void *ps;
+ unsigned *ps_const_ranges;
} cso_shader;
struct pipe_context *pipe;
diff --git a/src/gallium/state_trackers/nine/pixelshader9.c b/src/gallium/state_trackers/nine/pixelshader9.c
index f4b28e8d039..42ad2c76a7f 100644
--- a/src/gallium/state_trackers/nine/pixelshader9.c
+++ b/src/gallium/state_trackers/nine/pixelshader9.c
@@ -79,7 +79,9 @@ NinePixelShader9_ctor( struct NinePixelShader9 *This,
This->byte_code.size = info.byte_size;
This->variant.cso = info.cso;
+ This->variant.const_ranges = info.const_ranges;
This->last_cso = info.cso;
+ This->last_const_ranges = info.const_ranges;
This->last_key = 0;
This->sampler_mask = info.sampler_mask;
@@ -116,6 +118,7 @@ NinePixelShader9_dtor( struct NinePixelShader9 *This )
if (This->base.device->context.cso_shader.ps == var->cso)
pipe->bind_fs_state(pipe, NULL);
pipe->delete_fs_state(pipe, var->cso);
+ FREE(var->const_ranges);
}
var = var->next;
} while (var);
@@ -156,7 +159,7 @@ NinePixelShader9_GetFunction( struct NinePixelShader9 *This,
}
void *
-NinePixelShader9_GetVariant( struct NinePixelShader9 *This )
+NinePixelShader9_GetVariant( struct NinePixelShader9 *This, unsigned **const_ranges )
{
/* GetVariant is called from nine_context, thus we can
* get pipe directly */
@@ -165,10 +168,12 @@ NinePixelShader9_GetVariant( struct NinePixelShader9 *This )
uint64_t key;
key = This->next_key;
- if (key == This->last_key)
+ if (key == This->last_key) {
+ *const_ranges = This->last_const_ranges;
return This->last_cso;
+ }
- cso = nine_shader_variant_get(&This->variant, key);
+ cso = nine_shader_variant_get(&This->variant, const_ranges, key);
if (!cso) {
struct NineDevice9 *device = This->base.device;
struct nine_shader_info info;
@@ -205,12 +210,14 @@ NinePixelShader9_GetVariant( struct NinePixelShader9 *This )
hr = nine_translate_shader(This->base.device, &info, pipe);
if (FAILED(hr))
return NULL;
- nine_shader_variant_add(&This->variant, key, info.cso);
+ nine_shader_variant_add(&This->variant, key, info.cso, info.const_ranges);
cso = info.cso;
+ *const_ranges = info.const_ranges;
}
This->last_key = key;
This->last_cso = cso;
+ This->last_const_ranges = *const_ranges;
return cso;
}
diff --git a/src/gallium/state_trackers/nine/pixelshader9.h b/src/gallium/state_trackers/nine/pixelshader9.h
index d864eca15a4..62b5abb5962 100644
--- a/src/gallium/state_trackers/nine/pixelshader9.h
+++ b/src/gallium/state_trackers/nine/pixelshader9.h
@@ -62,6 +62,7 @@ struct NinePixelShader9
uint64_t last_key;
void *last_cso;
+ unsigned *last_const_ranges;
uint64_t next_key;
};
@@ -131,7 +132,7 @@ NinePixelShader9_UpdateKey( struct NinePixelShader9 *ps,
}
void *
-NinePixelShader9_GetVariant( struct NinePixelShader9 *ps );
+NinePixelShader9_GetVariant( struct NinePixelShader9 *ps, unsigned **const_ranges );
/*** public ***/
diff --git a/src/gallium/state_trackers/nine/vertexshader9.c b/src/gallium/state_trackers/nine/vertexshader9.c
index cffe8501677..d14b9702a18 100644
--- a/src/gallium/state_trackers/nine/vertexshader9.c
+++ b/src/gallium/state_trackers/nine/vertexshader9.c
@@ -94,7 +94,9 @@ NineVertexShader9_ctor( struct NineVertexShader9 *This,
This->byte_code.size = info.byte_size;
This->variant.cso = info.cso;
+ This->variant.const_ranges = info.const_ranges;
This->last_cso = info.cso;
+ This->last_const_ranges = info.const_ranges;
This->last_key = (uint32_t) (info.swvp_on << 9);
This->const_used_size = info.const_used_size;
@@ -133,6 +135,7 @@ NineVertexShader9_dtor( struct NineVertexShader9 *This )
if (This->base.device->context.cso_shader.vs == var->cso)
pipe->bind_vs_state(pipe, NULL);
pipe->delete_vs_state(pipe, var->cso);
+ FREE(var->const_ranges);
}
var = var->next;
} while (var);
@@ -182,7 +185,7 @@ NineVertexShader9_GetFunction( struct NineVertexShader9 *This,
}
void *
-NineVertexShader9_GetVariant( struct NineVertexShader9 *This )
+NineVertexShader9_GetVariant( struct NineVertexShader9 *This, unsigned **const_ranges )
{
/* GetVariant is called from nine_context, thus we can
* get pipe directly */
@@ -191,10 +194,12 @@ NineVertexShader9_GetVariant( struct NineVertexShader9 *This )
uint64_t key;
key = This->next_key;
- if (key == This->last_key)
+ if (key == This->last_key) {
+ *const_ranges = This->last_const_ranges;
return This->last_cso;
+ }
- cso = nine_shader_variant_get(&This->variant, key);
+ cso = nine_shader_variant_get(&This->variant, const_ranges, key);
if (!cso) {
struct NineDevice9 *device = This->base.device;
struct nine_shader_info info;
@@ -218,12 +223,14 @@ NineVertexShader9_GetVariant( struct NineVertexShader9 *This )
hr = nine_translate_shader(This->base.device, &info, pipe);
if (FAILED(hr))
return NULL;
- nine_shader_variant_add(&This->variant, key, info.cso);
+ nine_shader_variant_add(&This->variant, key, info.cso, info.const_ranges);
cso = info.cso;
+ *const_ranges = info.const_ranges;
}
This->last_key = key;
This->last_cso = cso;
+ This->last_const_ranges = *const_ranges;
return cso;
}
diff --git a/src/gallium/state_trackers/nine/vertexshader9.h b/src/gallium/state_trackers/nine/vertexshader9.h
index 766b2fd13ea..0b139c5dad1 100644
--- a/src/gallium/state_trackers/nine/vertexshader9.h
+++ b/src/gallium/state_trackers/nine/vertexshader9.h
@@ -72,6 +72,7 @@ struct NineVertexShader9
uint64_t last_key;
void *last_cso;
+ unsigned *last_const_ranges;
uint64_t next_key;
@@ -123,7 +124,7 @@ NineVertexShader9_UpdateKey( struct NineVertexShader9 *vs,
}
void *
-NineVertexShader9_GetVariant( struct NineVertexShader9 *vs );
+NineVertexShader9_GetVariant( struct NineVertexShader9 *vs, unsigned **const_ranges );
void *
NineVertexShader9_GetVariantProcessVertices( struct NineVertexShader9 *vs,