Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(341)

Side by Side Diff: gpu/command_buffer/service/shader_cache.h

Issue 10534173: GPU Program Caching (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698