Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 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_CACHE_H_ | |
| 6 #define GPU_COMMAND_BUFFER_SERVICE_SHADER_CACHE_H_ | |
| 7 #pragma once | |
| 8 | |
| 9 #include "base/memory/weak_ptr.h" | |
| 10 #include "gpu/command_buffer/common/gles2_cmd_format.h" | |
| 11 | |
| 12 namespace gpu { | |
| 13 | |
| 14 const uint32 kShaderCacheBufferSize = 4*1024*1024; | |
| 15 | |
| 16 enum CompiledShaderStatus { | |
|
greggman
2012/06/15 08:10:24
move these inside ShaderCache so they aren't in th
dmurph
2012/06/19 01:08:33
Done.
| |
| 17 SHADER_CACHE_COMPILATION_UNKNOWN, | |
| 18 SHADER_CACHE_COMPILATION_SUCCEEDED | |
| 19 }; | |
| 20 | |
| 21 enum LinkedProgramStatus { | |
| 22 SHADER_CACHE_LINK_UNKNOWN, | |
| 23 SHADER_CACHE_LINK_SUCCEEDED | |
| 24 }; | |
| 25 | |
| 26 class ShaderCache : public base::SupportsWeakPtr<ShaderCache>{ | |
| 27 public: | |
| 28 ShaderCache() : cache_buffer_(new char[kShaderCacheBufferSize]) { }; | |
|
greggman
2012/06/15 08:10:24
how does this work???
dmurph
2012/06/15 16:40:23
Trying to find a good place for the buffer for ret
| |
| 29 virtual ~ShaderCache() { delete[] cache_buffer_; } | |
| 30 | |
| 31 virtual bool isShaderCacheEnabled() = 0; | |
| 32 | |
| 33 virtual CompiledShaderStatus getShaderCompilationStatus( | |
| 34 const char* shader_src) = 0; | |
| 35 virtual void setShaderCompilationStatus(const char* shader_src, | |
| 36 CompiledShaderStatus status) = 0; | |
| 37 | |
| 38 virtual LinkedProgramStatus getLinkedProgramStatus( | |
| 39 const char* untranslated_a, | |
| 40 const char* untranslated_b) = 0; | |
| 41 virtual void setLinkedProgramStatus(const char* untranslated_a, | |
| 42 const char* untranslated_b, | |
| 43 LinkedProgramStatus status) = 0; | |
| 44 | |
| 45 virtual void getLinkedProgram(const char* untranslated_a, | |
| 46 const char* untranslated_b, | |
| 47 GLsizei* length, | |
| 48 GLenum* binaryFormat, | |
| 49 const GLvoid** binary) = 0; | |
| 50 virtual void setLinkedProgram(const char* untranslated_a, | |
| 51 const char* untranslated_b, | |
| 52 GLsizei length, | |
| 53 GLenum binaryFormat, | |
| 54 GLvoid* binary) = 0; | |
| 55 | |
| 56 char* cache_buffer() { return cache_buffer_; } | |
| 57 private: | |
| 58 char* cache_buffer_; | |
| 59 }; | |
| 60 | |
| 61 struct CachedShaderKey { | |
|
greggman
2012/06/15 08:10:24
These keys probably need a version number or the c
dmurph
2012/06/15 16:40:23
Yeah, so I'm thinking the shader_cache could be no
| |
| 62 CachedShaderKey() | |
| 63 : untranslated_src(0), | |
| 64 gl_vendor(0), | |
| 65 gl_renderer(0), | |
| 66 vendor_id(0), | |
| 67 driver_id(0) { }; | |
| 68 CachedShaderKey(const char* _untranslated_src, | |
|
greggman
2012/06/15 08:10:24
given the use this seems like it should be 'const&
dmurph
2012/06/19 01:08:33
Done.
| |
| 69 const char* _gl_vendor, | |
| 70 const char* _gl_renderer, | |
| 71 const uint32 _vendor_id, | |
| 72 const uint32 _driver_id) : | |
| 73 untranslated_src(_untranslated_src), | |
| 74 gl_vendor(_gl_vendor), | |
| 75 gl_renderer(_gl_renderer), | |
| 76 vendor_id(_vendor_id), | |
| 77 driver_id(_driver_id) { }; | |
| 78 const char* untranslated_src; | |
|
greggman
2012/06/15 08:10:24
these strings need to be std::string or something
dmurph
2012/06/15 16:40:23
Yeah
| |
| 79 const char* gl_vendor; | |
| 80 const char* gl_renderer; | |
| 81 uint32 vendor_id; | |
| 82 uint32 driver_id; | |
| 83 }; | |
| 84 | |
| 85 struct CachedShaderKeyHash { | |
| 86 inline size_t operator()(const CachedShaderKey& key) const; | |
| 87 }; | |
| 88 | |
| 89 struct CachedShaderKeyEquals { | |
| 90 inline bool operator()(const CachedShaderKey& a, | |
| 91 const CachedShaderKey& b) const; | |
| 92 }; | |
| 93 | |
| 94 struct CachedProgramKey { | |
| 95 CachedProgramKey() | |
| 96 : untranslated_src_0(0), | |
| 97 untranslated_src_1(0), | |
| 98 gl_vendor(0), | |
| 99 gl_renderer(0), | |
| 100 vendor_id(0), | |
| 101 driver_id(0) { }; | |
| 102 CachedProgramKey(const char* _untranslated_src_0, | |
|
greggman
2012/06/15 08:10:24
same here? should it be 'const& std::string' ?
dmurph
2012/06/19 01:08:33
Done.
| |
| 103 const char* _untranslated_src_1, | |
| 104 const char* _gl_vendor, | |
| 105 const char* _gl_renderer, | |
| 106 const uint32 _vendor_id, | |
| 107 const uint32 _driver_id) : | |
| 108 untranslated_src_0(_untranslated_src_0), | |
| 109 untranslated_src_1(_untranslated_src_1), | |
| 110 gl_vendor(_gl_vendor), | |
| 111 gl_renderer(_gl_renderer), | |
| 112 vendor_id(_vendor_id), | |
| 113 driver_id(_driver_id) {}; | |
| 114 const char* untranslated_src_0; | |
|
greggman
2012/06/15 08:10:24
same here. these need to be something that stores
dmurph
2012/06/19 01:08:33
Done.
| |
| 115 const char* untranslated_src_1; | |
| 116 const char* gl_vendor; | |
| 117 const char* gl_renderer; | |
| 118 uint32 vendor_id; | |
| 119 uint32 driver_id; | |
| 120 }; | |
| 121 | |
| 122 struct CachedProgramKeyHash { | |
| 123 inline size_t operator()(const CachedProgramKey& key) const; | |
| 124 }; | |
| 125 | |
| 126 struct CachedProgramKeyEquals { | |
| 127 inline bool operator()(const CachedProgramKey& a, | |
| 128 const CachedProgramKey& b) const; | |
| 129 }; | |
| 130 | |
| 131 // sbdm hash function | |
| 132 inline unsigned int sbdm(const char *str) { | |
| 133 unsigned int hash = 0; | |
| 134 int c; | |
| 135 while ((c = *str++)) | |
| 136 hash = c + (hash << 6) + (hash << 16) - hash; | |
| 137 return hash; | |
| 138 } | |
| 139 | |
| 140 inline size_t CachedShaderKeyHash::operator()( | |
| 141 const CachedShaderKey& key) const { | |
| 142 unsigned int hash = sbdm(key.untranslated_src); | |
| 143 hash = (hash << 6) + (hash << 16) - hash + sbdm(key.gl_vendor); | |
| 144 hash = (hash << 6) + (hash << 16) - hash + sbdm(key.gl_renderer); | |
| 145 hash = (hash << 6) + (hash << 16) - hash + key.vendor_id; | |
| 146 hash = (hash << 6) + (hash << 16) - hash + key.driver_id; | |
| 147 return hash; | |
| 148 } | |
| 149 | |
| 150 inline bool CachedShaderKeyEquals::operator()(const CachedShaderKey& a, | |
| 151 const CachedShaderKey& b) const { | |
| 152 return strcmp(a.untranslated_src, b.untranslated_src) == 0 | |
| 153 && strcmp(a.gl_vendor, b.gl_vendor) == 0 | |
| 154 && strcmp(a.gl_renderer, b.gl_renderer) == 0 && a.vendor_id == b.vendor_id | |
| 155 && a.driver_id == b.driver_id; | |
| 156 } | |
| 157 | |
| 158 inline size_t CachedProgramKeyHash::operator()( | |
| 159 const CachedProgramKey& key) const { | |
| 160 unsigned int hash = sbdm(key.untranslated_src_0) | |
| 161 + sbdm(key.untranslated_src_1); | |
| 162 hash = (hash << 6) + (hash << 16) - hash + sbdm(key.gl_vendor); | |
| 163 hash = (hash << 6) + (hash << 16) - hash + sbdm(key.gl_renderer); | |
| 164 hash = (hash << 6) + (hash << 16) - hash + key.vendor_id; | |
| 165 hash = (hash << 6) + (hash << 16) - hash + key.driver_id; | |
| 166 return hash; | |
| 167 } | |
| 168 | |
| 169 inline bool CachedProgramKeyEquals::operator()( | |
| 170 const CachedProgramKey& a, | |
| 171 const CachedProgramKey& b) const { | |
| 172 return strcmp(a.untranslated_src_0, b.untranslated_src_0) == 0 && | |
| 173 strcmp(a.untranslated_src_1, b.untranslated_src_1) == 0 && | |
| 174 strcmp(a.gl_vendor, b.gl_vendor) == 0 && | |
| 175 strcmp(a.gl_renderer, b.gl_renderer) == 0 && | |
| 176 a.vendor_id == b.vendor_id && | |
| 177 a.driver_id == b.driver_id; | |
| 178 } | |
| 179 | |
| 180 } // namespace gpu | |
| 181 | |
| 182 | |
|
greggman
2012/06/15 08:10:24
style: remove extra blank lines
dmurph
2012/06/19 01:08:33
Done.
| |
| 183 | |
| 184 #endif // GPU_COMMAND_BUFFER_SERVICE_SHADER_CACHE_H_ | |
| OLD | NEW |