From 229c496d4a47bd610c97af0578ce6b1e2a982c57 Mon Sep 17 00:00:00 2001 From: Fredrik Ehnbom Date: Tue, 12 Oct 2010 09:34:04 -0700 Subject: Performance optimizations for MagicSmoke The MagicSmoke wallpaper was modified to be single pass multi texture rather than blended multipass. Change-Id: If838a4abd2c3fa73def46c47d1f362c8a2af3363 --- src/com/android/magicsmoke/clouds.rs | 176 ++++++++++++++++++++++------------- 1 file changed, 113 insertions(+), 63 deletions(-) (limited to 'src/com/android/magicsmoke/clouds.rs') diff --git a/src/com/android/magicsmoke/clouds.rs b/src/com/android/magicsmoke/clouds.rs index 9cd28cc..5e67950 100644 --- a/src/com/android/magicsmoke/clouds.rs +++ b/src/com/android/magicsmoke/clouds.rs @@ -44,10 +44,33 @@ float gAlphaMul; int gPreMul; int gBlendFunc; -rs_program_vertex gPVBackground; -rs_program_fragment gPFBackground; -rs_program_store gPFSBackgroundOne; -rs_program_store gPFSBackgroundSrc; +typedef struct VertexShaderConstants_s { + float4 layer0; + float4 layer1; + float4 layer2; + float4 layer3; + float4 layer4; +} VertexShaderConstants; +VertexShaderConstants *gVSConstants; + +typedef struct FragmentShaderConstants_s { + float4 clearColor; +} FragmentShaderConstants; +FragmentShaderConstants *gFSConstants; + +typedef struct VertexInputs_s { + float4 position; + float2 texture0; +} VertexInputs; +VertexInputs *gVS; + + +rs_program_fragment gPF5tex; +rs_program_vertex gPV5tex; +rs_program_fragment gPF4tex; +rs_program_vertex gPV4tex; + +rs_program_store gPStore; rs_allocation gTnoise1; rs_allocation gTnoise2; @@ -78,33 +101,81 @@ static int currentpreset; static int lastuptime; static float timedelta; static float4 clearColor = {0.5f, 0.0f, 0.0f, 1.0f}; - -void drawCloud(rs_matrix4x4 *ident, rs_allocation allocat, int idx) { - rs_matrix4x4 mat1; - float z = -8.f * idx; - rsMatrixLoad(&mat1, ident); - rsMatrixTranslate(&mat1, -gXOffset * 8.f * idx, -gTilt * idx / 3.f, 0.f); - rsMatrixRotate(&mat1, rotation[idx], 0.f, 0.f, 1.f); - rsgProgramVertexLoadModelMatrix(&mat1); - - rsgBindTexture(gPFBackground, 0, allocat); - rsgDrawQuadTexCoords( - -1200.0f, -1200.0f, z, // space - 0.f + xshift[idx], 0.f, // texture - 1200, -1200.0f, z, // space - scale[idx] + xshift[idx], 0.f, // texture - 1200, 1200.0f, z, // space - scale[idx] + xshift[idx], scale[idx], // texture - -1200.0f, 1200.0f, z, // space - 0.f + xshift[idx], scale[idx]); // texture +int countTextures() +{ + int pos = 0; + for (int i = 0; i < 5; i++) + { + if (gTextureMask & (1<layer0, rotation[0]); + rotate(gVSConstants->layer1, rotation[1]); + rotate(gVSConstants->layer2, rotation[2]); + rotate(gVSConstants->layer3, rotation[3]); + rotate(gVSConstants->layer4, rotation[4]); + + gVSConstants->layer0.w = -gXOffset * 0 + xshift[0]; + gVSConstants->layer1.w = -gXOffset * 8 + xshift[1]; + gVSConstants->layer2.w = -gXOffset * 16 + xshift[2]; + gVSConstants->layer3.w = -gXOffset * 24 + xshift[3]; + gVSConstants->layer4.w = -gXOffset * 32 + xshift[4]; + + float m = 0.35f; + gVSConstants->layer0.z = m * scale[0]; + gVSConstants->layer1.z = m * scale[1]; + gVSConstants->layer2.z = m * scale[2]; + gVSConstants->layer3.z = m * scale[3]; + gVSConstants->layer4.z = m * scale[4]; + + gFSConstants->clearColor = clearColor; + + int pos = 0; + for (int i = 0; i < 5; i++) + { + if (gTextureMask & (1<