Home | History | Annotate | Download | only in service
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef GPU_COMMAND_BUFFER_SERVICE_SHADER_TRANSLATOR_CACHE_H_
      6 #define GPU_COMMAND_BUFFER_SERVICE_SHADER_TRANSLATOR_CACHE_H_
      7 
      8 #include <string.h>
      9 
     10 #include <map>
     11 
     12 #include "base/memory/ref_counted.h"
     13 #include "gpu/command_buffer/service/shader_translator.h"
     14 #include "third_party/angle/include/GLSLANG/ShaderLang.h"
     15 
     16 namespace gpu {
     17 namespace gles2 {
     18 
     19 // This class is not thread safe and can only be created and destroyed
     20 // on a single thread. But it is safe to use two independent instances on two
     21 // threads without synchronization.
     22 //
     23 // TODO(backer): Investigate using glReleaseShaderCompiler as an alternative to
     24 // to this cache.
     25 class GPU_EXPORT ShaderTranslatorCache
     26     : public base::RefCounted<ShaderTranslatorCache>,
     27       public NON_EXPORTED_BASE(ShaderTranslator::DestructionObserver) {
     28  public:
     29   ShaderTranslatorCache();
     30 
     31   // ShaderTranslator::DestructionObserver implementation
     32   virtual void OnDestruct(ShaderTranslator* translator) OVERRIDE;
     33 
     34   scoped_refptr<ShaderTranslator> GetTranslator(
     35       sh::GLenum shader_type,
     36       ShShaderSpec shader_spec,
     37       const ShBuiltInResources* resources,
     38       ShaderTranslatorInterface::GlslImplementationType
     39           glsl_implementation_type,
     40       ShCompileOptions driver_bug_workarounds);
     41 
     42  private:
     43   friend class base::RefCounted<ShaderTranslatorCache>;
     44   virtual ~ShaderTranslatorCache();
     45 
     46   // Parameters passed into ShaderTranslator::Init
     47   struct ShaderTranslatorInitParams {
     48     sh::GLenum shader_type;
     49     ShShaderSpec shader_spec;
     50     ShBuiltInResources resources;
     51     ShaderTranslatorInterface::GlslImplementationType
     52         glsl_implementation_type;
     53     ShCompileOptions driver_bug_workarounds;
     54 
     55     ShaderTranslatorInitParams(
     56         sh::GLenum shader_type,
     57         ShShaderSpec shader_spec,
     58         const ShBuiltInResources& resources,
     59         ShaderTranslatorInterface::GlslImplementationType
     60             glsl_implementation_type,
     61         ShCompileOptions driver_bug_workarounds)
     62       : shader_type(shader_type),
     63         shader_spec(shader_spec),
     64         resources(resources),
     65         glsl_implementation_type(glsl_implementation_type),
     66         driver_bug_workarounds(driver_bug_workarounds) {
     67     }
     68 
     69     ShaderTranslatorInitParams(const ShaderTranslatorInitParams& params) {
     70       memcpy(this, &params, sizeof(*this));
     71     }
     72 
     73     bool operator== (const ShaderTranslatorInitParams& params) const {
     74       return memcmp(&params, this, sizeof(*this)) == 0;
     75     }
     76 
     77     bool operator< (const ShaderTranslatorInitParams& params) const {
     78       return memcmp(&params, this, sizeof(*this)) < 0;
     79     }
     80   };
     81 
     82   typedef std::map<ShaderTranslatorInitParams, ShaderTranslator* > Cache;
     83   Cache cache_;
     84 
     85   DISALLOW_COPY_AND_ASSIGN(ShaderTranslatorCache);
     86 };
     87 
     88 }  // namespace gles2
     89 }  // namespace gpu
     90 
     91 #endif  // GPU_COMMAND_BUFFER_SERVICE_SHADER_TRANSLATOR_CACHE_H_
     92