Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #if defined(USE_X11) | 5 #if defined(USE_X11) |
| 6 #include <X11/Xlib.h> | 6 #include <X11/Xlib.h> |
| 7 #endif | 7 #endif |
| 8 | 8 |
| 9 #include "base/at_exit.h" | 9 #include "base/at_exit.h" |
| 10 #include "base/bind.h" | 10 #include "base/bind.h" |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 131 int frames() const { return frames_; } | 131 int frames() const { return frames_; } |
| 132 | 132 |
| 133 private: | 133 private: |
| 134 TimeTicks start_time_; | 134 TimeTicks start_time_; |
| 135 int frames_; | 135 int frames_; |
| 136 int max_frames_; | 136 int max_frames_; |
| 137 | 137 |
| 138 DISALLOW_COPY_AND_ASSIGN(BenchCompositorObserver); | 138 DISALLOW_COPY_AND_ASSIGN(BenchCompositorObserver); |
| 139 }; | 139 }; |
| 140 | 140 |
| 141 class WebGLTexture : public ui::Texture { | 141 void ReturnMailbox(scoped_refptr<cc::ContextProvider> context_provider, |
| 142 public: | 142 unsigned int texture, |
|
danakj
2014/04/08 16:08:01
nit: uint32?
piman
2014/04/08 23:17:46
GLuint
| |
| 143 WebGLTexture(gpu::gles2::GLES2Interface* gl, const gfx::Size& size) | 143 unsigned int sync_point, |
| 144 : ui::Texture(false, size, 1.0f), | 144 bool is_lost) { |
| 145 gl_(gl), | 145 if (is_lost) |
| 146 texture_id_(0u) { | 146 return; |
|
danakj
2014/04/08 16:08:01
Don't you want to delete the texture here, just be
piman
2014/04/08 23:17:46
Done.
| |
| 147 gl->GenTextures(1, &texture_id_); | 147 gpu::gles2::GLES2Interface* gl = context_provider->ContextGL(); |
| 148 gl->BindTexture(GL_TEXTURE_2D, texture_id_); | 148 gl->WaitSyncPointCHROMIUM(sync_point); |
| 149 gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | 149 gl->DeleteTextures(1, &texture); |
| 150 gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | 150 gl->ShallowFlushCHROMIUM(); |
| 151 gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | 151 } |
| 152 gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | |
| 153 gl->TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, size.width(), size.height(), | |
| 154 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL); | |
| 155 } | |
| 156 | |
| 157 virtual unsigned int PrepareTexture() OVERRIDE { | |
| 158 return texture_id_; | |
| 159 } | |
| 160 | |
| 161 private: | |
| 162 virtual ~WebGLTexture() { | |
| 163 gl_->DeleteTextures(1, &texture_id_); | |
| 164 } | |
| 165 | |
| 166 gpu::gles2::GLES2Interface* gl_; | |
| 167 GLuint texture_id_; | |
| 168 | |
| 169 DISALLOW_COPY_AND_ASSIGN(WebGLTexture); | |
| 170 }; | |
| 171 | 152 |
| 172 // A benchmark that adds a texture layer that is updated every frame. | 153 // A benchmark that adds a texture layer that is updated every frame. |
| 173 class WebGLBench : public BenchCompositorObserver { | 154 class WebGLBench : public BenchCompositorObserver { |
| 174 public: | 155 public: |
| 175 WebGLBench(Layer* parent, Compositor* compositor, int max_frames) | 156 WebGLBench(Layer* parent, Compositor* compositor, int max_frames) |
| 176 : BenchCompositorObserver(max_frames), | 157 : BenchCompositorObserver(max_frames), |
| 177 parent_(parent), | 158 parent_(parent), |
| 178 webgl_(ui::LAYER_TEXTURED), | 159 webgl_(ui::LAYER_TEXTURED), |
| 179 compositor_(compositor), | 160 compositor_(compositor), |
| 180 texture_(), | |
| 181 fbo_(0), | 161 fbo_(0), |
| 182 do_draw_(true) { | 162 do_draw_(true) { |
| 183 CommandLine* command_line = CommandLine::ForCurrentProcess(); | 163 CommandLine* command_line = CommandLine::ForCurrentProcess(); |
| 184 do_draw_ = !command_line->HasSwitch("disable-draw"); | 164 do_draw_ = !command_line->HasSwitch("disable-draw"); |
| 185 | 165 |
| 186 std::string webgl_size = command_line->GetSwitchValueASCII("webgl-size"); | 166 std::string webgl_size = command_line->GetSwitchValueASCII("webgl-size"); |
| 187 int width = 0; | 167 int width = 0; |
| 188 int height = 0; | 168 int height = 0; |
| 189 if (!webgl_size.empty()) { | 169 if (!webgl_size.empty()) { |
| 190 std::vector<std::string> split_size; | 170 std::vector<std::string> split_size; |
| 191 base::SplitString(webgl_size, 'x', &split_size); | 171 base::SplitString(webgl_size, 'x', &split_size); |
| 192 if (split_size.size() == 2) { | 172 if (split_size.size() == 2) { |
| 193 width = atoi(split_size[0].c_str()); | 173 width = atoi(split_size[0].c_str()); |
| 194 height = atoi(split_size[1].c_str()); | 174 height = atoi(split_size[1].c_str()); |
| 195 } | 175 } |
| 196 } | 176 } |
| 197 if (!width || !height) { | 177 if (!width || !height) { |
| 198 width = 800; | 178 width = 800; |
| 199 height = 600; | 179 height = 600; |
| 200 } | 180 } |
| 201 gfx::Rect bounds(width, height); | 181 gfx::Rect bounds(width, height); |
| 202 webgl_.SetBounds(bounds); | 182 webgl_.SetBounds(bounds); |
| 203 parent_->Add(&webgl_); | 183 parent_->Add(&webgl_); |
| 204 | 184 |
| 205 context_provider_ = | 185 context_provider_ = |
| 206 ui::ContextFactory::GetInstance()->SharedMainThreadContextProvider(); | 186 ui::ContextFactory::GetInstance()->SharedMainThreadContextProvider(); |
| 207 gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL(); | 187 gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL(); |
| 208 texture_ = new WebGLTexture(gl, bounds.size()); | 188 unsigned int texture = 0; |
| 189 gl->GenTextures(1, &texture); | |
| 190 gl->BindTexture(GL_TEXTURE_2D, texture); | |
| 191 gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); | |
| 192 gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); | |
| 193 gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); | |
| 194 gl->TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); | |
| 195 gl->TexImage2D(GL_TEXTURE_2D, | |
| 196 0, | |
| 197 GL_RGBA, | |
| 198 width, | |
| 199 height, | |
| 200 0, | |
| 201 GL_RGBA, | |
| 202 GL_UNSIGNED_BYTE, | |
| 203 NULL); | |
| 204 gpu::Mailbox mailbox; | |
| 205 gl->GenMailboxCHROMIUM(mailbox.name); | |
| 206 gl->ProduceTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name); | |
| 207 | |
| 209 gl->GenFramebuffers(1, &fbo_); | 208 gl->GenFramebuffers(1, &fbo_); |
| 210 compositor->AddObserver(this); | |
| 211 webgl_.SetExternalTexture(texture_.get()); | |
| 212 gl->BindFramebuffer(GL_FRAMEBUFFER, fbo_); | 209 gl->BindFramebuffer(GL_FRAMEBUFFER, fbo_); |
| 213 gl->FramebufferTexture2D( | 210 gl->FramebufferTexture2D( |
| 214 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, | 211 GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0); |
| 215 GL_TEXTURE_2D, texture_->PrepareTexture(), 0); | |
| 216 gl->ClearColor(0.f, 1.f, 0.f, 1.f); | 212 gl->ClearColor(0.f, 1.f, 0.f, 1.f); |
| 217 gl->Clear(GL_COLOR_BUFFER_BIT); | 213 gl->Clear(GL_COLOR_BUFFER_BIT); |
| 218 gl->Flush(); | 214 gl->Flush(); |
| 215 | |
| 216 unsigned int sync_point = gl->InsertSyncPointCHROMIUM(); | |
|
danakj
2014/04/08 16:08:01
uint32? (trying to keep "unsigned int" inside cc/,
piman
2014/04/08 23:17:46
GLuint
| |
| 217 webgl_.SetTextureMailbox( | |
| 218 cc::TextureMailbox(mailbox, GL_TEXTURE_2D, sync_point), | |
| 219 cc::SingleReleaseCallback::Create( | |
| 220 base::Bind(ReturnMailbox, context_provider_, texture)), | |
| 221 bounds.size()); | |
| 222 compositor->AddObserver(this); | |
| 219 } | 223 } |
| 220 | 224 |
| 221 virtual ~WebGLBench() { | 225 virtual ~WebGLBench() { |
| 222 context_provider_->ContextGL()->DeleteFramebuffers(1, &fbo_); | |
| 223 webgl_.SetShowPaintedContent(); | 226 webgl_.SetShowPaintedContent(); |
| 224 texture_ = NULL; | 227 gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL(); |
| 228 gl->DeleteFramebuffers(1, &fbo_); | |
| 225 compositor_->RemoveObserver(this); | 229 compositor_->RemoveObserver(this); |
| 226 } | 230 } |
| 227 | 231 |
| 228 virtual void Draw() OVERRIDE { | 232 virtual void Draw() OVERRIDE { |
| 229 if (do_draw_) { | 233 if (do_draw_) { |
| 230 gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL(); | 234 gpu::gles2::GLES2Interface* gl = context_provider_->ContextGL(); |
| 231 gl->ClearColor((frames() % kFrames)*1.0/kFrames, 1.f, 0.f, 1.f); | 235 gl->ClearColor((frames() % kFrames)*1.0/kFrames, 1.f, 0.f, 1.f); |
| 232 gl->Clear(GL_COLOR_BUFFER_BIT); | 236 gl->Clear(GL_COLOR_BUFFER_BIT); |
| 233 gl->Flush(); | 237 gl->Flush(); |
| 234 } | 238 } |
| 235 webgl_.SetExternalTexture(texture_.get()); | |
| 236 webgl_.SchedulePaint(gfx::Rect(webgl_.bounds().size())); | 239 webgl_.SchedulePaint(gfx::Rect(webgl_.bounds().size())); |
| 237 compositor_->ScheduleDraw(); | 240 compositor_->ScheduleDraw(); |
| 238 } | 241 } |
| 239 | 242 |
| 240 private: | 243 private: |
| 241 Layer* parent_; | 244 Layer* parent_; |
| 242 Layer webgl_; | 245 Layer webgl_; |
| 243 Compositor* compositor_; | 246 Compositor* compositor_; |
| 244 scoped_refptr<cc::ContextProvider> context_provider_; | 247 scoped_refptr<cc::ContextProvider> context_provider_; |
| 245 scoped_refptr<WebGLTexture> texture_; | |
| 246 | 248 |
| 247 // The FBO that is used to render to the texture. | 249 // The FBO that is used to render to the texture. |
| 248 unsigned int fbo_; | 250 unsigned int fbo_; |
| 249 | 251 |
| 250 // Whether or not to draw to the texture every frame. | 252 // Whether or not to draw to the texture every frame. |
| 251 bool do_draw_; | 253 bool do_draw_; |
| 252 | 254 |
| 253 DISALLOW_COPY_AND_ASSIGN(WebGLBench); | 255 DISALLOW_COPY_AND_ASSIGN(WebGLBench); |
| 254 }; | 256 }; |
| 255 | 257 |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 361 ui::PrintLayerHierarchy(host->window()->layer(), gfx::Point(100, 100)); | 363 ui::PrintLayerHierarchy(host->window()->layer(), gfx::Point(100, 100)); |
| 362 #endif | 364 #endif |
| 363 | 365 |
| 364 host->Show(); | 366 host->Show(); |
| 365 base::MessageLoopForUI::current()->Run(); | 367 base::MessageLoopForUI::current()->Run(); |
| 366 focus_client.reset(); | 368 focus_client.reset(); |
| 367 host.reset(); | 369 host.reset(); |
| 368 | 370 |
| 369 return 0; | 371 return 0; |
| 370 } | 372 } |
| OLD | NEW |