Project

General

Profile

« Previous | Next » 

Revision 03cb451d

Added by Leszek Koltunski about 7 years ago

Speed up shaders (both compilation and execution) by explicitly enabling only the needed effects.

View differences:

src/main/java/org/distorted/library/DistortedEffects.java
55 55
  private static final int TEX_DATA_SIZE     = 2; // Main Program: size of the texture coordinate data in elements.
56 56

  
57 57
  private static DistortedProgram mProgram;
58
  private static boolean[] mEffectEnabled = new boolean[EffectNames.size()];
59

  
60
  static
61
    {
62
    int len = EffectNames.size();
63

  
64
    for(int i=0; i<len; i++)
65
      {
66
      mEffectEnabled[i] = false;
67
      }
68
    }
58 69

  
59 70
  /// DEBUG ONLY /////
60 71
  private static DistortedProgram mDebugProgram;
......
91 102
  static void createProgram(Resources resources)
92 103
  throws FragmentCompilationException,VertexCompilationException,VertexUniformsException,FragmentUniformsException,LinkingException
93 104
    {
94
    final InputStream mainVertexStream   = resources.openRawResource(R.raw.main_vertex_shader);
95
    final InputStream mainFragmentStream = resources.openRawResource(R.raw.main_fragment_shader);
105
    final InputStream mainVertStream = resources.openRawResource(R.raw.main_vertex_shader);
106
    final InputStream mainFragStream = resources.openRawResource(R.raw.main_fragment_shader);
107

  
108
    String mainVertHeader= ("#version 100\n");
109
    String mainFragHeader= ("#version 100\n");
96 110

  
97
    String mainVertexHeader= ("#version 100\n#define NUM_VERTEX "  + getMaxVertex()+"\n");
111
    EffectNames name;
112
    EffectTypes type;
113
    boolean foundF = false;
114
    boolean foundV = false;
98 115

  
99
    for(EffectNames name: EffectNames.values() )
116
    for(int i=0; i<mEffectEnabled.length; i++)
100 117
      {
101
      if( name.getType()== EffectTypes.VERTEX)
102
        mainVertexHeader += ("#define "+name.name()+" "+name.ordinal()+"\n");
118
      if( mEffectEnabled[i] )
119
        {
120
        name = EffectNames.getName(i);
121
        type = EffectNames.getType(i);
122

  
123
        if( type == EffectTypes.VERTEX )
124
          {
125
          mainVertHeader += ("#define "+name.name()+" "+name.ordinal()+"\n");
126
          foundV = true;
127
          }
128
        else if( type == EffectTypes.FRAGMENT )
129
          {
130
          mainFragHeader += ("#define "+name.name()+" "+name.ordinal()+"\n");
131
          foundF = true;
132
          }
133
        }
103 134
      }
104 135

  
105
    String mainFragmentHeader= ("#version 100\n#define NUM_FRAGMENT "  + getMaxFragment()+"\n");
136
    mainVertHeader += ("#define NUM_VERTEX "   + ( foundV ? getMaxVertex()   : 0 ) + "\n");
137
    mainFragHeader += ("#define NUM_FRAGMENT " + ( foundF ? getMaxFragment() : 0 ) + "\n");
106 138

  
107
    for(EffectNames name: EffectNames.values() )
108
      {
109
      if( name.getType()== EffectTypes.FRAGMENT)
110
        mainFragmentHeader += ("#define "+name.name()+" "+name.ordinal()+"\n");
111
      }
139
    //android.util.Log.e("Effects", "vertHeader= "+mainVertHeader);
140
    //android.util.Log.e("Effects", "fragHeader= "+mainFragHeader);
112 141

  
113
    mProgram = new DistortedProgram(mainVertexStream,mainFragmentStream, mainVertexHeader, mainFragmentHeader);
142
    mProgram = new DistortedProgram(mainVertStream,mainFragStream, mainVertHeader, mainFragHeader);
114 143

  
115 144
    int mainProgramH = mProgram.getProgramHandle();
116 145
    EffectQueueFragment.getUniforms(mainProgramH);
......
332 361
  static void onDestroy()
333 362
    {
334 363
    mNextID = 0;
364

  
365
    int len = EffectNames.size();
366

  
367
    for(int i=0; i<len; i++)
368
      {
369
      mEffectEnabled[i] = false;
370
      }
335 371
    }
336 372

  
337 373
///////////////////////////////////////////////////////////////////////////////////////////////////
......
498 534
    return false;
499 535
    }
500 536

  
537
///////////////////////////////////////////////////////////////////////////////////////////////////
538
/**
539
 * Enables a given Effect.
540
 * <p>
541
 * By default, all effects are disabled. One has to explicitly enable each effect one intends to use.
542
 * This needs to be called BEFORE shaders get compiled, i.e. before the call to Distorted.onCreate().
543
 * The point: by enabling only the effects we need, we can optimize the shaders.
544
 *
545
 * @param name Name of the Effect to enable.
546
 */
547
  public static void enableEffect(EffectNames name)
548
    {
549
    mEffectEnabled[name.ordinal()] = true;
550
    }
551

  
501 552
///////////////////////////////////////////////////////////////////////////////////////////////////
502 553
/**
503 554
 * Returns the maximum number of Matrix effects.

Also available in: Unified diff