etnaviv: Set shader instruction area correctly for GC3000
- Use the same instruction area on GC3000 as the Vivante driver. This allows the same number of instructions on GC3000 as GC2000 instead of half. - Makes sure that the "PE to FE" stall before updating the shader code or constants is hit (which is conditional on vs_offset > 0x4000). This is necessary on GC3000 too, it increases stability. Signed-off-by: Wladimir J. van der Laan <laanwj@gmail.com> Reviewed-by: Christian Gmeiner <christian.gmeiner@gmail.com>
This commit is contained in:
parent
0fe60e4fcc
commit
55e00c7cfe
|
@ -627,14 +627,30 @@ etna_get_specs(struct etna_screen *screen)
|
||||||
screen->specs.has_new_sin_cos =
|
screen->specs.has_new_sin_cos =
|
||||||
VIV_FEATURE(screen, chipMinorFeatures3, HAS_FAST_TRANSCENDENTALS);
|
VIV_FEATURE(screen, chipMinorFeatures3, HAS_FAST_TRANSCENDENTALS);
|
||||||
|
|
||||||
if (instruction_count > 256) { /* unified instruction memory? */
|
if (VIV_FEATURE(screen, chipMinorFeatures3, INSTRUCTION_CACHE)) {
|
||||||
|
/* GC3000 - this core is capable of loading shaders from
|
||||||
|
* memory. It can also run shaders from registers, as a fallback, but
|
||||||
|
* "max_instructions" does not have the correct value. It has place for
|
||||||
|
* 2*256 instructions just like GC2000, but the offsets are slightly
|
||||||
|
* different.
|
||||||
|
*/
|
||||||
screen->specs.vs_offset = 0xC000;
|
screen->specs.vs_offset = 0xC000;
|
||||||
screen->specs.ps_offset = 0xD000; /* like vivante driver */
|
/* State 08000-0C000 mirrors 0C000-0E000, and the Vivante driver uses
|
||||||
|
* this mirror for writing PS instructions, probably safest to do the
|
||||||
|
* same.
|
||||||
|
*/
|
||||||
|
screen->specs.ps_offset = 0x8000 + 0x1000;
|
||||||
screen->specs.max_instructions = 256;
|
screen->specs.max_instructions = 256;
|
||||||
} else {
|
} else {
|
||||||
screen->specs.vs_offset = 0x4000;
|
if (instruction_count > 256) { /* unified instruction memory? */
|
||||||
screen->specs.ps_offset = 0x6000;
|
screen->specs.vs_offset = 0xC000;
|
||||||
screen->specs.max_instructions = instruction_count / 2;
|
screen->specs.ps_offset = 0xD000; /* like vivante driver */
|
||||||
|
screen->specs.max_instructions = 256;
|
||||||
|
} else {
|
||||||
|
screen->specs.vs_offset = 0x4000;
|
||||||
|
screen->specs.ps_offset = 0x6000;
|
||||||
|
screen->specs.max_instructions = instruction_count / 2;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (VIV_FEATURE(screen, chipMinorFeatures1, HALTI0)) {
|
if (VIV_FEATURE(screen, chipMinorFeatures1, HALTI0)) {
|
||||||
|
|
Loading…
Reference in New Issue