projects
/
profile
/
ivi
/
mesa.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
62eb9ed
)
r300g: eliminate unused constants in VS
author
Marek Olšák
<maraeo@gmail.com>
Mon, 23 Aug 2010 03:56:48 +0000
(
05:56
+0200)
committer
Marek Olšák
<maraeo@gmail.com>
Wed, 25 Aug 2010 00:44:29 +0000
(
02:44
+0200)
src/gallium/drivers/r300/r300_context.h
patch
|
blob
|
history
src/gallium/drivers/r300/r300_emit.c
patch
|
blob
|
history
src/gallium/drivers/r300/r300_fs.c
patch
|
blob
|
history
src/gallium/drivers/r300/r300_state.c
patch
|
blob
|
history
src/gallium/drivers/r300/r300_vs.c
patch
|
blob
|
history
diff --git
a/src/gallium/drivers/r300/r300_context.h
b/src/gallium/drivers/r300/r300_context.h
index
c596d1c
..
8f0e86f
100644
(file)
--- a/
src/gallium/drivers/r300/r300_context.h
+++ b/
src/gallium/drivers/r300/r300_context.h
@@
-254,6
+254,8
@@
struct r300_ztop_state {
struct r300_constant_buffer {
/* Buffer of constants */
uint32_t *ptr;
struct r300_constant_buffer {
/* Buffer of constants */
uint32_t *ptr;
+ /* Remapping table. */
+ unsigned *remap_table;
};
/* Query object.
};
/* Query object.
diff --git
a/src/gallium/drivers/r300/r300_emit.c
b/src/gallium/drivers/r300/r300_emit.c
index
87d9950
..
d3ca232
100644
(file)
--- a/
src/gallium/drivers/r300/r300_emit.c
+++ b/
src/gallium/drivers/r300/r300_emit.c
@@
-961,6
+961,7
@@
void r300_emit_vs_constants(struct r300_context* r300,
unsigned count =
((struct r300_vertex_shader*)r300->vs_state.state)->externals_count;
struct r300_constant_buffer *buf = (struct r300_constant_buffer*)state;
unsigned count =
((struct r300_vertex_shader*)r300->vs_state.state)->externals_count;
struct r300_constant_buffer *buf = (struct r300_constant_buffer*)state;
+ unsigned i;
CS_LOCALS(r300);
if (!count)
CS_LOCALS(r300);
if (!count)
@@
-971,7
+972,14
@@
void r300_emit_vs_constants(struct r300_context* r300,
(r300->screen->caps.is_r500 ?
R500_PVS_CONST_START : R300_PVS_CONST_START));
OUT_CS_ONE_REG(R300_VAP_PVS_UPLOAD_DATA, count * 4);
(r300->screen->caps.is_r500 ?
R500_PVS_CONST_START : R300_PVS_CONST_START));
OUT_CS_ONE_REG(R300_VAP_PVS_UPLOAD_DATA, count * 4);
- OUT_CS_TABLE(buf->ptr, count * 4);
+ if (buf->remap_table){
+ for (i = 0; i < count; i++) {
+ uint32_t *data = &buf->ptr[buf->remap_table[i]*4];
+ OUT_CS_TABLE(data, 4);
+ }
+ } else {
+ OUT_CS_TABLE(buf->ptr, count * 4);
+ }
END_CS;
}
END_CS;
}
diff --git
a/src/gallium/drivers/r300/r300_fs.c
b/src/gallium/drivers/r300/r300_fs.c
index
315d5b8
..
d95587b
100644
(file)
--- a/
src/gallium/drivers/r300/r300_fs.c
+++ b/
src/gallium/drivers/r300/r300_fs.c
@@
-431,9
+431,8
@@
static void r300_translate_fragment_shader(
}
if (compiler.Base.Error) {
}
if (compiler.Base.Error) {
- DBG(r300, DBG_FP, "r300 FP: Compiler Error:\n%sUsing a dummy shader"
- " instead.\nIf there's an 'unknown opcode' message, please"
- " file a bug report and attach this log.\n", compiler.Base.ErrorMsg);
+ fprintf(stderr, "r300 FP: Compiler Error:\n%sUsing a dummy shader"
+ " instead.\n", compiler.Base.ErrorMsg);
if (shader->dummy) {
fprintf(stderr, "r300 FP: Cannot compile the dummy shader! "
if (shader->dummy) {
fprintf(stderr, "r300 FP: Cannot compile the dummy shader! "
diff --git
a/src/gallium/drivers/r300/r300_state.c
b/src/gallium/drivers/r300/r300_state.c
index
c4e270b
..
ed39c57
100644
(file)
--- a/
src/gallium/drivers/r300/r300_state.c
+++ b/
src/gallium/drivers/r300/r300_state.c
@@
-1765,6
+1765,9
@@
static void r300_bind_vs_state(struct pipe_context* pipe, void* shader)
r300->vs_constants.size = 0;
}
r300->vs_constants.size = 0;
}
+ ((struct r300_constant_buffer*)r300->vs_constants.state)->remap_table =
+ vs->code.constants_remap_table;
+
r300->pvs_flush.dirty = TRUE;
} else {
draw_bind_vertex_shader(r300->draw,
r300->pvs_flush.dirty = TRUE;
} else {
draw_bind_vertex_shader(r300->draw,
@@
-1779,6
+1782,8
@@
static void r300_delete_vs_state(struct pipe_context* pipe, void* shader)
if (r300->screen->caps.has_tcl) {
rc_constants_destroy(&vs->code.constants);
if (r300->screen->caps.has_tcl) {
rc_constants_destroy(&vs->code.constants);
+ if (vs->code.constants_remap_table)
+ FREE(vs->code.constants_remap_table);
} else {
draw_delete_vertex_shader(r300->draw,
(struct draw_vertex_shader*)vs->draw_vs);
} else {
draw_delete_vertex_shader(r300->draw,
(struct draw_vertex_shader*)vs->draw_vs);
diff --git
a/src/gallium/drivers/r300/r300_vs.c
b/src/gallium/drivers/r300/r300_vs.c
index
54c8de1
..
5f8dbb2
100644
(file)
--- a/
src/gallium/drivers/r300/r300_vs.c
+++ b/
src/gallium/drivers/r300/r300_vs.c
@@
-196,6
+196,7
@@
void r300_translate_vertex_shader(struct r300_context *r300,
{
struct r300_vertex_program_compiler compiler;
struct tgsi_to_rc ttr;
{
struct r300_vertex_program_compiler compiler;
struct tgsi_to_rc ttr;
+ unsigned i;
/* Setup the compiler */
rc_init(&compiler.Base);
/* Setup the compiler */
rc_init(&compiler.Base);
@@
-205,6
+206,7
@@
void r300_translate_vertex_shader(struct r300_context *r300,
compiler.UserData = vs;
compiler.Base.is_r500 = r300->screen->caps.is_r500;
compiler.Base.max_temp_regs = 32;
compiler.UserData = vs;
compiler.Base.is_r500 = r300->screen->caps.is_r500;
compiler.Base.max_temp_regs = 32;
+ compiler.Base.remove_unused_constants = TRUE;
if (compiler.Base.Debug) {
DBG(r300, DBG_VP, "r300: Initial vertex program\n");
if (compiler.Base.Debug) {
DBG(r300, DBG_VP, "r300: Initial vertex program\n");
@@
-227,9
+229,8
@@
void r300_translate_vertex_shader(struct r300_context *r300,
/* Invoke the compiler */
r3xx_compile_vertex_program(&compiler);
if (compiler.Base.Error) {
/* Invoke the compiler */
r3xx_compile_vertex_program(&compiler);
if (compiler.Base.Error) {
- DBG(r300, DBG_VP, "r300 VP: Compiler error:\n%sUsing a dummy shader"
- " instead.\nIf there's an 'unknown opcode' message, please"
- " file a bug report and attach this log.\n", compiler.Base.ErrorMsg);
+ fprintf(stderr, "r300 VP: Compiler error:\n%sUsing a dummy shader"
+ " instead.\n", compiler.Base.ErrorMsg);
if (vs->dummy) {
fprintf(stderr, "r300 VP: Cannot compile the dummy shader! "
if (vs->dummy) {
fprintf(stderr, "r300 VP: Cannot compile the dummy shader! "
@@
-243,7
+244,15
@@
void r300_translate_vertex_shader(struct r300_context *r300,
}
/* Initialize numbers of constants for each type. */
}
/* Initialize numbers of constants for each type. */
- vs->externals_count = ttr.immediate_offset;
+ vs->externals_count = 0;
+ for (i = 0;
+ i < vs->code.constants.Count &&
+ vs->code.constants.Constants[i].Type == RC_CONSTANT_EXTERNAL; i++) {
+ vs->externals_count = i+1;
+ }
+ for (; i < vs->code.constants.Count; i++) {
+ assert(vs->code.constants.Constants[i].Type == RC_CONSTANT_IMMEDIATE);
+ }
vs->immediates_count = vs->code.constants.Count - vs->externals_count;
/* And, finally... */
vs->immediates_count = vs->code.constants.Count - vs->externals_count;
/* And, finally... */