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

Side by Side Diff: ui/gfx/compositor/compositor_win.cc

Issue 7552039: Vend common GL context (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address reviewer comments. Created 9 years, 3 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 | Annotate | Revision Log
« no previous file with comments | « ui/gfx/compositor/compositor_gl.cc ('k') | ui/gfx/compositor/layer.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 #include "ui/gfx/compositor/compositor.h" 5 #include "ui/gfx/compositor/compositor.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <d3dx10.h> 8 #include <d3dx10.h>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 public: 49 public:
50 ViewTexture(CompositorWin* compositor, 50 ViewTexture(CompositorWin* compositor,
51 ID3D10Device* device, 51 ID3D10Device* device,
52 ID3D10Effect* effect); 52 ID3D10Effect* effect);
53 53
54 // Texture: 54 // Texture:
55 virtual void SetCanvas(const SkCanvas& canvas, 55 virtual void SetCanvas(const SkCanvas& canvas,
56 const gfx::Point& origin, 56 const gfx::Point& origin,
57 const gfx::Size& overall_size) OVERRIDE; 57 const gfx::Size& overall_size) OVERRIDE;
58 virtual void Draw(const ui::TextureDrawParams& params) OVERRIDE; 58 virtual void Draw(const ui::TextureDrawParams& params) OVERRIDE;
59
60 virtual void Draw(const ui::TextureDrawParams& params, 59 virtual void Draw(const ui::TextureDrawParams& params,
61 const gfx::Rect& clip_bounds_in_texture) OVERRIDE; 60 const gfx::Rect& clip_bounds_in_texture) OVERRIDE;
62 61
63 private: 62 private:
64 ~ViewTexture(); 63 ~ViewTexture();
65 64
66 void Errored(HRESULT result); 65 void Errored(HRESULT result);
67 66
68 void ConvertBitmapToD3DData(const SkBitmap& bitmap, 67 void ConvertBitmapToD3DData(const SkBitmap& bitmap,
69 scoped_array<uint32>* converted_data); 68 scoped_array<uint32>* converted_data);
(...skipping 20 matching lines...) Expand all
90 CompositorWin(gfx::AcceleratedWidget widget, 89 CompositorWin(gfx::AcceleratedWidget widget,
91 const gfx::Size& size); 90 const gfx::Size& size);
92 91
93 void Init(); 92 void Init();
94 93
95 // Invoked to update the perspective needed by this texture. |transform| is 94 // Invoked to update the perspective needed by this texture. |transform| is
96 // the transform for the texture, and |size| the size of the texture. 95 // the transform for the texture, and |size| the size of the texture.
97 void UpdatePerspective(const ui::Transform& transform, 96 void UpdatePerspective(const ui::Transform& transform,
98 const gfx::Size& view_size); 97 const gfx::Size& view_size);
99 98
100 // Returns the overall size of the compositor.
101 const gfx::Size& GetHostSize();
102
103 // Returns the index buffer used for drawing a texture. 99 // Returns the index buffer used for drawing a texture.
104 ID3D10Buffer* GetTextureIndexBuffer(); 100 ID3D10Buffer* GetTextureIndexBuffer();
105 101
106 // Compositor: 102 // Compositor:
107 virtual Texture* CreateTexture() OVERRIDE; 103 virtual Texture* CreateTexture() OVERRIDE;
108 virtual void NotifyStart() OVERRIDE; 104 virtual void NotifyStart() OVERRIDE;
109 virtual void NotifyEnd() OVERRIDE; 105 virtual void NotifyEnd() OVERRIDE;
110 virtual void Blur(const gfx::Rect& bounds) OVERRIDE; 106 virtual void Blur(const gfx::Rect& bounds) OVERRIDE;
111 virtual void SchedulePaint() OVERRIDE; 107 virtual void SchedulePaint() OVERRIDE;
112 virtual void OnWidgetSizeChanged(const gfx::Size& size) OVERRIDE; 108
109 protected:
110 virtual void OnWidgetSizeChanged() OVERRIDE;
113 111
114 private: 112 private:
115 enum Direction { 113 enum Direction {
116 HORIZONTAL, 114 HORIZONTAL,
117 VERTICAL 115 VERTICAL
118 }; 116 };
119 117
120 ~CompositorWin(); 118 ~CompositorWin();
121 119
122 void Errored(HRESULT error_code); 120 void Errored(HRESULT error_code);
123 121
124 void CreateDevice(); 122 void CreateDevice();
125 123
126 void LoadEffects(); 124 void LoadEffects();
127 125
128 void InitVertexLayout(); 126 void InitVertexLayout();
129 127
130 void Resize(const gfx::Size& size);
131
132 // Updates the kernel used for blurring. Size is the size of the texture 128 // Updates the kernel used for blurring. Size is the size of the texture
133 // being drawn to along the appropriate axis. 129 // being drawn to along the appropriate axis.
134 void UpdateBlurKernel(Direction direction, int size); 130 void UpdateBlurKernel(Direction direction, int size);
135 131
136 // Creates a texture, render target view and shader. 132 // Creates a texture, render target view and shader.
137 void CreateTexture(const gfx::Size& size, 133 void CreateTexture(const gfx::Size& size,
138 ID3D10Texture2D** texture, 134 ID3D10Texture2D** texture,
139 ID3D10RenderTargetView** render_target_view, 135 ID3D10RenderTargetView** render_target_view,
140 ID3D10ShaderResourceView** shader_resource_view); 136 ID3D10ShaderResourceView** shader_resource_view);
141 137
142 // Creates |vertex_buffer_|. 138 // Creates |vertex_buffer_|.
143 void CreateVertexBuffer(); 139 void CreateVertexBuffer();
144 140
145 // Creates |index_buffer_|. 141 // Creates |index_buffer_|.
146 void CreateIndexBuffer(); 142 void CreateIndexBuffer();
147 143
148 // Creates a vertex buffer for the specified region. The caller owns the 144 // Creates a vertex buffer for the specified region. The caller owns the
149 // return value. 145 // return value.
150 ID3D10Buffer* CreateVertexBufferForRegion(const gfx::Rect& bounds); 146 ID3D10Buffer* CreateVertexBufferForRegion(const gfx::Rect& bounds);
151 147
152 gfx::AcceleratedWidget host_; 148 gfx::AcceleratedWidget host_;
153 149
154 // Size the device was last created at.
155 gfx::Size last_size_;
156
157 ScopedComPtr<ID3D10Device> device_; 150 ScopedComPtr<ID3D10Device> device_;
158 ScopedComPtr<IDXGISwapChain> swap_chain_; 151 ScopedComPtr<IDXGISwapChain> swap_chain_;
159 ScopedComPtr<ID3D10RenderTargetView> dest_render_target_view_; 152 ScopedComPtr<ID3D10RenderTargetView> dest_render_target_view_;
160 ScopedComPtr<ID3D10Texture2D> depth_stencil_buffer_; 153 ScopedComPtr<ID3D10Texture2D> depth_stencil_buffer_;
161 ScopedComPtr<ID3D10DepthStencilView> depth_stencil_view_; 154 ScopedComPtr<ID3D10DepthStencilView> depth_stencil_view_;
162 ScopedComPtr<ID3D10Effect, NULL> fx_; 155 ScopedComPtr<ID3D10Effect, NULL> fx_;
163 ID3D10EffectTechnique* technique_; 156 ID3D10EffectTechnique* technique_;
164 157
165 // Layout for Vertex. 158 // Layout for Vertex.
166 ScopedComPtr<ID3D10InputLayout> vertex_layout_; 159 ScopedComPtr<ID3D10InputLayout> vertex_layout_;
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
298 (SkColorGetA(color) << 24) | 291 (SkColorGetA(color) << 24) |
299 (SkColorGetB(color) << 16) | 292 (SkColorGetB(color) << 16) |
300 (SkColorGetG(color) << 8) | 293 (SkColorGetG(color) << 8) |
301 (SkColorGetR(color)); 294 (SkColorGetR(color));
302 } 295 }
303 } 296 }
304 } 297 }
305 298
306 void ViewTexture::CreateVertexBuffer(const gfx::Size& size) { 299 void ViewTexture::CreateVertexBuffer(const gfx::Size& size) {
307 vertex_buffer_.Release(); 300 vertex_buffer_.Release();
308 const gfx::Size& host_size = compositor_->GetHostSize(); 301 const gfx::Size& host_size = compositor_->size();
309 float x = static_cast<float>(host_size.width()) / 2.0f; 302 float x = static_cast<float>(host_size.width()) / 2.0f;
310 float y = static_cast<float>(host_size.height()) / 2.0f; 303 float y = static_cast<float>(host_size.height()) / 2.0f;
311 float w = static_cast<float>(size.width()); 304 float w = static_cast<float>(size.width());
312 float h = static_cast<float>(size.height()); 305 float h = static_cast<float>(size.height());
313 Vertex vertices[] = { 306 Vertex vertices[] = {
314 { D3DXVECTOR3(0.0f, -h, 0.0f), D3DXVECTOR2(0.0f, 1.0f) }, 307 { D3DXVECTOR3(0.0f, -h, 0.0f), D3DXVECTOR2(0.0f, 1.0f) },
315 { D3DXVECTOR3(0.0f, 0.0f, 0.0f), D3DXVECTOR2(0.0f, 0.0f) }, 308 { D3DXVECTOR3(0.0f, 0.0f, 0.0f), D3DXVECTOR2(0.0f, 0.0f) },
316 { D3DXVECTOR3( w, 0.0f, 0.0f), D3DXVECTOR2(1.0f, 0.0f) }, 309 { D3DXVECTOR3( w, 0.0f, 0.0f), D3DXVECTOR2(1.0f, 0.0f) },
317 { D3DXVECTOR3( w, -h, 0.0f), D3DXVECTOR2(1.0f, 1.0f) }, 310 { D3DXVECTOR3( w, -h, 0.0f), D3DXVECTOR2(1.0f, 1.0f) },
318 }; 311 };
319 312
320 // Create the vertex buffer containing the points. 313 // Create the vertex buffer containing the points.
321 D3D10_BUFFER_DESC buffer_desc; 314 D3D10_BUFFER_DESC buffer_desc;
322 buffer_desc.Usage = D3D10_USAGE_IMMUTABLE; 315 buffer_desc.Usage = D3D10_USAGE_IMMUTABLE;
323 buffer_desc.ByteWidth = sizeof(Vertex) * ARRAYSIZE_UNSAFE(vertices); 316 buffer_desc.ByteWidth = sizeof(Vertex) * ARRAYSIZE_UNSAFE(vertices);
324 buffer_desc.BindFlags = D3D10_BIND_VERTEX_BUFFER; 317 buffer_desc.BindFlags = D3D10_BIND_VERTEX_BUFFER;
325 buffer_desc.CPUAccessFlags = 0; 318 buffer_desc.CPUAccessFlags = 0;
326 buffer_desc.MiscFlags = 0; 319 buffer_desc.MiscFlags = 0;
327 D3D10_SUBRESOURCE_DATA init_data; 320 D3D10_SUBRESOURCE_DATA init_data;
328 init_data.pSysMem = vertices; 321 init_data.pSysMem = vertices;
329 RETURN_IF_FAILED(device_->CreateBuffer(&buffer_desc, &init_data, 322 RETURN_IF_FAILED(device_->CreateBuffer(&buffer_desc, &init_data,
330 vertex_buffer_.Receive())); 323 vertex_buffer_.Receive()));
331 } 324 }
332 325
333 CompositorWin::CompositorWin(gfx::AcceleratedWidget widget, 326 CompositorWin::CompositorWin(gfx::AcceleratedWidget widget,
334 const gfx::Size& size) 327 const gfx::Size& size)
335 : host_(widget), 328 : Compositor(size),
336 technique_(NULL), 329 host_(widget),
337 last_size_(size) { 330 technique_(NULL) {
338 } 331 }
339 332
340 void CompositorWin::Init() { 333 void CompositorWin::Init() {
341 CreateDevice(); 334 CreateDevice();
342 LoadEffects(); 335 LoadEffects();
343 Resize(last_size_); 336 OnWidgetSizeChanged();
344 InitVertexLayout(); 337 InitVertexLayout();
345 CreateVertexBuffer(); 338 CreateVertexBuffer();
346 CreateIndexBuffer(); 339 CreateIndexBuffer();
347 } 340 }
348 341
349 void CompositorWin::UpdatePerspective(const ui::Transform& transform, 342 void CompositorWin::UpdatePerspective(const ui::Transform& transform,
350 const gfx::Size& view_size) { 343 const gfx::Size& view_size) {
351 float transform_data_buffer[16]; 344 float transform_data_buffer[16];
352 transform.matrix().asColMajorf(transform_data_buffer); 345 transform.matrix().asColMajorf(transform_data_buffer);
353 D3DXMATRIX transform_matrix(&transform_data_buffer[0]); 346 D3DXMATRIX transform_matrix(&transform_data_buffer[0]);
354 std::swap(transform_matrix._12, transform_matrix._21); 347 std::swap(transform_matrix._12, transform_matrix._21);
355 std::swap(transform_matrix._13, transform_matrix._31); 348 std::swap(transform_matrix._13, transform_matrix._31);
356 std::swap(transform_matrix._23, transform_matrix._32); 349 std::swap(transform_matrix._23, transform_matrix._32);
357 350
358 // Different coordinate system; flip the y. 351 // Different coordinate system; flip the y.
359 transform_matrix._42 *= -1; 352 transform_matrix._42 *= -1;
360 353
361 // Scale so x and y are from 0-2. 354 // Scale so x and y are from 0-2.
362 D3DXMATRIX scale_matrix; 355 D3DXMATRIX scale_matrix;
363 D3DXMatrixScaling( 356 D3DXMatrixScaling(
364 &scale_matrix, 357 &scale_matrix,
365 2.0f / static_cast<float>(last_size_.width()), 358 2.0f / static_cast<float>(size().width()),
366 2.0f / static_cast<float>(last_size_.height()), 359 2.0f / static_cast<float>(size().height()),
367 1.0f); 360 1.0f);
368 361
369 // Translate so x and y are from -1,-1 to 1,1. 362 // Translate so x and y are from -1,-1 to 1,1.
370 D3DXMATRIX translate_matrix; 363 D3DXMATRIX translate_matrix;
371 D3DXMatrixTranslation(&translate_matrix, -1.0f, 1.0f, 0.0f); 364 D3DXMatrixTranslation(&translate_matrix, -1.0f, 1.0f, 0.0f);
372 365
373 D3DXMATRIX projection_matrix; 366 D3DXMATRIX projection_matrix;
374 D3DXMatrixIdentity(&projection_matrix); 367 D3DXMatrixIdentity(&projection_matrix);
375 D3DXMatrixPerspectiveFovLH(&projection_matrix, 368 D3DXMatrixPerspectiveFovLH(&projection_matrix,
376 atanf(.5f) * 2.0f, 1.0f, 1.0f, 1000.0f); 369 atanf(.5f) * 2.0f, 1.0f, 1.0f, 1000.0f);
377 D3DXVECTOR3 pos(0.0f, 0.0f, -2.0f); 370 D3DXVECTOR3 pos(0.0f, 0.0f, -2.0f);
378 D3DXVECTOR3 target(0.0f, 0.0f, 0.0f); 371 D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);
379 D3DXVECTOR3 up(0.0f, 1.0f, 0.0f); 372 D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
380 D3DXMATRIX view; 373 D3DXMATRIX view;
381 D3DXMatrixIdentity(&view); 374 D3DXMatrixIdentity(&view);
382 D3DXMatrixLookAtLH(&view, &pos, &target, &up); 375 D3DXMatrixLookAtLH(&view, &pos, &target, &up);
383 376
384 D3DXMATRIX wvp = transform_matrix * scale_matrix * translate_matrix * view * 377 D3DXMATRIX wvp = transform_matrix * scale_matrix * translate_matrix * view *
385 projection_matrix; 378 projection_matrix;
386 379
387 fx_->GetVariableByName("gWVP")->AsMatrix()->SetMatrix(wvp); 380 fx_->GetVariableByName("gWVP")->AsMatrix()->SetMatrix(wvp);
388 } 381 }
389 382
390 const gfx::Size& CompositorWin::GetHostSize() {
391 return last_size_;
392 }
393
394 ID3D10Buffer* CompositorWin::GetTextureIndexBuffer() { 383 ID3D10Buffer* CompositorWin::GetTextureIndexBuffer() {
395 return index_buffer_.get(); 384 return index_buffer_.get();
396 } 385 }
397 386
398 Texture* CompositorWin::CreateTexture() { 387 Texture* CompositorWin::CreateTexture() {
399 return new ViewTexture(this, device_.get(), fx_.get()); 388 return new ViewTexture(this, device_.get(), fx_.get());
400 } 389 }
401 390
402 void CompositorWin::NotifyStart() { 391 void CompositorWin::NotifyStart() {
403 ID3D10RenderTargetView* target_view = main_render_target_view_.get(); 392 ID3D10RenderTargetView* target_view = main_render_target_view_.get();
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
462 ID3D10Buffer* vertex_buffer = scoped_vertex_buffer.get(); 451 ID3D10Buffer* vertex_buffer = scoped_vertex_buffer.get();
463 UINT stride = sizeof(Vertex); 452 UINT stride = sizeof(Vertex);
464 UINT offset = 0; 453 UINT offset = 0;
465 device_->IASetVertexBuffers(0, 1, &vertex_buffer, &stride, &offset); 454 device_->IASetVertexBuffers(0, 1, &vertex_buffer, &stride, &offset);
466 device_->IASetIndexBuffer(index_buffer_.get(), DXGI_FORMAT_R32_UINT, 0); 455 device_->IASetIndexBuffer(index_buffer_.get(), DXGI_FORMAT_R32_UINT, 0);
467 device_->DrawIndexed(6, 0, 0); 456 device_->DrawIndexed(6, 0, 0);
468 D3DXMATRIX identity_matrix; 457 D3DXMATRIX identity_matrix;
469 D3DXMatrixIdentity(&identity_matrix); 458 D3DXMatrixIdentity(&identity_matrix);
470 459
471 // Horizontal blur from the main texture to blur texture. 460 // Horizontal blur from the main texture to blur texture.
472 UpdateBlurKernel(HORIZONTAL, last_size_.width()); 461 UpdateBlurKernel(HORIZONTAL, size().width());
473 ID3D10RenderTargetView* target_view = blur_render_target_view_.get(); 462 ID3D10RenderTargetView* target_view = blur_render_target_view_.get();
474 device_->OMSetRenderTargets(1, &target_view, NULL); 463 device_->OMSetRenderTargets(1, &target_view, NULL);
475 RETURN_IF_FAILED( 464 RETURN_IF_FAILED(
476 blur_fx_->GetVariableByName("textureMap")->AsShaderResource()-> 465 blur_fx_->GetVariableByName("textureMap")->AsShaderResource()->
477 SetResource(main_texture_shader_view_.get())); 466 SetResource(main_texture_shader_view_.get()));
478 blur_fx_->GetVariableByName("gWVP")->AsMatrix()->SetMatrix( 467 blur_fx_->GetVariableByName("gWVP")->AsMatrix()->SetMatrix(
479 identity_matrix); 468 identity_matrix);
480 ID3D10EffectTechnique* technique = blur_fx_->GetTechniqueByName("ViewTech"); 469 ID3D10EffectTechnique* technique = blur_fx_->GetTechniqueByName("ViewTech");
481 DCHECK(technique); 470 DCHECK(technique);
482 D3D10_TECHNIQUE_DESC tech_desc; 471 D3D10_TECHNIQUE_DESC tech_desc;
483 technique->GetDesc(&tech_desc); 472 technique->GetDesc(&tech_desc);
484 for(UINT p = 0; p < tech_desc.Passes; ++p) 473 for(UINT p = 0; p < tech_desc.Passes; ++p)
485 technique->GetPassByIndex(p)->Apply(0); 474 technique->GetPassByIndex(p)->Apply(0);
486 device_->DrawIndexed(6, 0, 0); 475 device_->DrawIndexed(6, 0, 0);
487 476
488 { 477 {
489 // We do this to avoid a warning. 478 // We do this to avoid a warning.
490 ID3D10ShaderResourceView* tmp = NULL; 479 ID3D10ShaderResourceView* tmp = NULL;
491 device_->PSSetShaderResources(0, 1, &tmp); 480 device_->PSSetShaderResources(0, 1, &tmp);
492 } 481 }
493 482
494 // Vertical blur from the blur texture back to main buffer. 483 // Vertical blur from the blur texture back to main buffer.
495 RETURN_IF_FAILED( 484 RETURN_IF_FAILED(
496 blur_fx_->GetVariableByName("textureMap")->AsShaderResource()-> 485 blur_fx_->GetVariableByName("textureMap")->AsShaderResource()->
497 SetResource(blur_texture_shader_view_.get())); 486 SetResource(blur_texture_shader_view_.get()));
498 UpdateBlurKernel(VERTICAL, last_size_.height()); 487 UpdateBlurKernel(VERTICAL, size().height());
499 target_view = main_render_target_view_.get(); 488 target_view = main_render_target_view_.get();
500 device_->OMSetRenderTargets(1, &target_view, NULL); 489 device_->OMSetRenderTargets(1, &target_view, NULL);
501 for(UINT p = 0; p < tech_desc.Passes; ++p) 490 for(UINT p = 0; p < tech_desc.Passes; ++p)
502 technique->GetPassByIndex(p)->Apply(0); 491 technique->GetPassByIndex(p)->Apply(0);
503 device_->DrawIndexed(6, 0, 0); 492 device_->DrawIndexed(6, 0, 0);
504 493
505 #if !defined(NDEBUG) 494 #if !defined(NDEBUG)
506 // A warning is generated if a bound vertexbuffer is deleted. To avoid that 495 // A warning is generated if a bound vertexbuffer is deleted. To avoid that
507 // warning we reset the buffer here. We only do it for debug builds as it's 496 // warning we reset the buffer here. We only do it for debug builds as it's
508 // ok to effectively unbind the vertex buffer. 497 // ok to effectively unbind the vertex buffer.
509 vertex_buffer = vertex_buffer_.get(); 498 vertex_buffer = vertex_buffer_.get();
510 device_->IASetVertexBuffers(0, 1, &vertex_buffer, &stride, &offset); 499 device_->IASetVertexBuffers(0, 1, &vertex_buffer, &stride, &offset);
511 device_->IASetIndexBuffer(index_buffer_.get(), DXGI_FORMAT_R32_UINT, 0); 500 device_->IASetIndexBuffer(index_buffer_.get(), DXGI_FORMAT_R32_UINT, 0);
512 #endif 501 #endif
513 } 502 }
514 503
515 void CompositorWin::SchedulePaint() { 504 void CompositorWin::SchedulePaint() {
516 RECT bounds; 505 RECT bounds;
517 GetClientRect(host_, &bounds); 506 GetClientRect(host_, &bounds);
518 InvalidateRect(host_, &bounds, FALSE); 507 InvalidateRect(host_, &bounds, FALSE);
519 } 508 }
520 509
521 void CompositorWin::OnWidgetSizeChanged(const gfx::Size& size) { 510 void CompositorWin::OnWidgetSizeChanged() {
522 Resize(size); 511 dest_render_target_view_ = NULL;
512 depth_stencil_buffer_ = NULL;
513 depth_stencil_view_ = NULL;
514
515 main_render_target_view_ = NULL;
516 main_texture_ = NULL;
517 main_texture_shader_view_ = NULL;
518
519 blur_render_target_view_ = NULL;
520 blur_texture_ = NULL;
521 blur_texture_shader_view_ = NULL;
522
523 CreateTexture(size(), main_texture_.Receive(),
524 main_render_target_view_.Receive(),
525 main_texture_shader_view_.Receive());
526
527 CreateTexture(size(), blur_texture_.Receive(),
528 blur_render_target_view_.Receive(),
529 blur_texture_shader_view_.Receive());
530
531 // Resize the swap chain and recreate the render target view.
532 RETURN_IF_FAILED(swap_chain_->ResizeBuffers(
533 1, size().width(), size().height(), DXGI_FORMAT_R8G8B8A8_UNORM, 0));
534 ScopedComPtr<ID3D10Texture2D> back_buffer;
535 RETURN_IF_FAILED(swap_chain_->GetBuffer(
536 0, __uuidof(ID3D10Texture2D),
537 reinterpret_cast<void**>(back_buffer.Receive())));
538 RETURN_IF_FAILED(device_->CreateRenderTargetView(
539 back_buffer.get(), 0,
540 dest_render_target_view_.Receive()));
541
542 // Create the depth/stencil buffer and view.
543 D3D10_TEXTURE2D_DESC depth_stencil_desc;
544 depth_stencil_desc.Width = size().width();
545 depth_stencil_desc.Height = size().height();
546 depth_stencil_desc.MipLevels = 1;
547 depth_stencil_desc.ArraySize = 1;
548 depth_stencil_desc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
549 depth_stencil_desc.SampleDesc.Count = 1; // multisampling must match
550 depth_stencil_desc.SampleDesc.Quality = 0; // swap chain values.
551 depth_stencil_desc.Usage = D3D10_USAGE_DEFAULT;
552 depth_stencil_desc.BindFlags = D3D10_BIND_DEPTH_STENCIL;
553 depth_stencil_desc.CPUAccessFlags = 0;
554 depth_stencil_desc.MiscFlags = 0;
555
556 RETURN_IF_FAILED(device_->CreateTexture2D(&depth_stencil_desc, 0,
557 depth_stencil_buffer_.Receive()));
558 RETURN_IF_FAILED(device_->CreateDepthStencilView(
559 depth_stencil_buffer_.get(), 0,
560 depth_stencil_view_.Receive()));
561
562
563 // Set the viewport transform.
564 D3D10_VIEWPORT vp;
565 vp.TopLeftX = 0;
566 vp.TopLeftY = 0;
567 vp.Width = size().width();
568 vp.Height = size().height();
569 vp.MinDepth = 0.0f;
570 vp.MaxDepth = 1.0f;
571
572 device_->RSSetViewports(1, &vp);
523 } 573 }
524 574
525 CompositorWin::~CompositorWin() { 575 CompositorWin::~CompositorWin() {
526 } 576 }
527 577
528 void CompositorWin::Errored(HRESULT error_code) { 578 void CompositorWin::Errored(HRESULT error_code) {
529 // TODO: figure out error handling. 579 // TODO: figure out error handling.
530 DCHECK(false); 580 DCHECK(false);
531 } 581 }
532 582
533 void CompositorWin::CreateDevice() { 583 void CompositorWin::CreateDevice() {
534 DXGI_SWAP_CHAIN_DESC sd; 584 DXGI_SWAP_CHAIN_DESC sd;
535 sd.BufferDesc.Width = last_size_.width(); 585 sd.BufferDesc.Width = size().width();
536 sd.BufferDesc.Height = last_size_.height(); 586 sd.BufferDesc.Height = size().height();
537 sd.BufferDesc.RefreshRate.Numerator = 60; 587 sd.BufferDesc.RefreshRate.Numerator = 60;
538 sd.BufferDesc.RefreshRate.Denominator = 1; 588 sd.BufferDesc.RefreshRate.Denominator = 1;
539 sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; 589 sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
540 sd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED; 590 sd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
541 sd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED; 591 sd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
542 592
543 // No multisampling. 593 // No multisampling.
544 sd.SampleDesc.Count = 1; 594 sd.SampleDesc.Count = 1;
545 sd.SampleDesc.Quality = 0; 595 sd.SampleDesc.Quality = 0;
546 596
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 // Create the input layout 659 // Create the input layout
610 D3D10_PASS_DESC pass_desc; 660 D3D10_PASS_DESC pass_desc;
611 RETURN_IF_FAILED(technique_->GetPassByIndex(0)->GetDesc(&pass_desc)); 661 RETURN_IF_FAILED(technique_->GetPassByIndex(0)->GetDesc(&pass_desc));
612 RETURN_IF_FAILED( 662 RETURN_IF_FAILED(
613 device_->CreateInputLayout(vertex_desc, ARRAYSIZE_UNSAFE(vertex_desc), 663 device_->CreateInputLayout(vertex_desc, ARRAYSIZE_UNSAFE(vertex_desc),
614 pass_desc.pIAInputSignature, 664 pass_desc.pIAInputSignature,
615 pass_desc.IAInputSignatureSize, 665 pass_desc.IAInputSignatureSize,
616 vertex_layout_.Receive())); 666 vertex_layout_.Receive()));
617 } 667 }
618 668
619 void CompositorWin::Resize(const gfx::Size& size) {
620 last_size_ = size;
621
622 dest_render_target_view_ = NULL;
623 depth_stencil_buffer_ = NULL;
624 depth_stencil_view_ = NULL;
625
626 main_render_target_view_ = NULL;
627 main_texture_ = NULL;
628 main_texture_shader_view_ = NULL;
629
630 blur_render_target_view_ = NULL;
631 blur_texture_ = NULL;
632 blur_texture_shader_view_ = NULL;
633
634 CreateTexture(size, main_texture_.Receive(),
635 main_render_target_view_.Receive(),
636 main_texture_shader_view_.Receive());
637
638 CreateTexture(size, blur_texture_.Receive(),
639 blur_render_target_view_.Receive(),
640 blur_texture_shader_view_.Receive());
641
642 // Resize the swap chain and recreate the render target view.
643 RETURN_IF_FAILED(swap_chain_->ResizeBuffers(
644 1, size.width(), size.height(), DXGI_FORMAT_R8G8B8A8_UNORM, 0));
645 ScopedComPtr<ID3D10Texture2D> back_buffer;
646 RETURN_IF_FAILED(swap_chain_->GetBuffer(
647 0, __uuidof(ID3D10Texture2D),
648 reinterpret_cast<void**>(back_buffer.Receive())));
649 RETURN_IF_FAILED(device_->CreateRenderTargetView(
650 back_buffer.get(), 0,
651 dest_render_target_view_.Receive()));
652
653 // Create the depth/stencil buffer and view.
654 D3D10_TEXTURE2D_DESC depth_stencil_desc;
655 depth_stencil_desc.Width = size.width();
656 depth_stencil_desc.Height = size.height();
657 depth_stencil_desc.MipLevels = 1;
658 depth_stencil_desc.ArraySize = 1;
659 depth_stencil_desc.Format = DXGI_FORMAT_D24_UNORM_S8_UINT;
660 depth_stencil_desc.SampleDesc.Count = 1; // multisampling must match
661 depth_stencil_desc.SampleDesc.Quality = 0; // swap chain values.
662 depth_stencil_desc.Usage = D3D10_USAGE_DEFAULT;
663 depth_stencil_desc.BindFlags = D3D10_BIND_DEPTH_STENCIL;
664 depth_stencil_desc.CPUAccessFlags = 0;
665 depth_stencil_desc.MiscFlags = 0;
666
667 RETURN_IF_FAILED(device_->CreateTexture2D(&depth_stencil_desc, 0,
668 depth_stencil_buffer_.Receive()));
669 RETURN_IF_FAILED(device_->CreateDepthStencilView(
670 depth_stencil_buffer_.get(), 0,
671 depth_stencil_view_.Receive()));
672
673
674 // Set the viewport transform.
675 D3D10_VIEWPORT vp;
676 vp.TopLeftX = 0;
677 vp.TopLeftY = 0;
678 vp.Width = size.width();
679 vp.Height = size.height();
680 vp.MinDepth = 0.0f;
681 vp.MaxDepth = 1.0f;
682
683 device_->RSSetViewports(1, &vp);
684 }
685
686 void CompositorWin::UpdateBlurKernel(Direction direction, int size) { 669 void CompositorWin::UpdateBlurKernel(Direction direction, int size) {
687 // Update the blur data. 670 // Update the blur data.
688 const int kSize = 13; 671 const int kSize = 13;
689 float pixel_data[4 * kSize]; 672 float pixel_data[4 * kSize];
690 memset(pixel_data, 0, sizeof(float) * 4 * kSize); 673 memset(pixel_data, 0, sizeof(float) * 4 * kSize);
691 for (int i = 0; i < kSize; ++i) { 674 for (int i = 0; i < kSize; ++i) {
692 pixel_data[i * 4 + ((direction == HORIZONTAL) ? 0 : 1)] = 675 pixel_data[i * 4 + ((direction == HORIZONTAL) ? 0 : 1)] =
693 static_cast<float>(i - (kSize / 2)) / static_cast<float>(size); 676 static_cast<float>(i - (kSize / 2)) / static_cast<float>(size);
694 } 677 }
695 RETURN_IF_FAILED(blur_fx_->GetVariableByName("TexelKernel")->AsVector()-> 678 RETURN_IF_FAILED(blur_fx_->GetVariableByName("TexelKernel")->AsVector()->
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
766 index_buffer.MiscFlags = 0; 749 index_buffer.MiscFlags = 0;
767 D3D10_SUBRESOURCE_DATA init_data; 750 D3D10_SUBRESOURCE_DATA init_data;
768 init_data.pSysMem = indices; 751 init_data.pSysMem = indices;
769 RETURN_IF_FAILED(device_->CreateBuffer(&index_buffer, &init_data, 752 RETURN_IF_FAILED(device_->CreateBuffer(&index_buffer, &init_data,
770 index_buffer_.Receive())); 753 index_buffer_.Receive()));
771 } 754 }
772 755
773 ID3D10Buffer* CompositorWin::CreateVertexBufferForRegion( 756 ID3D10Buffer* CompositorWin::CreateVertexBufferForRegion(
774 const gfx::Rect& bounds) { 757 const gfx::Rect& bounds) {
775 float x = static_cast<float>(bounds.x()) / 758 float x = static_cast<float>(bounds.x()) /
776 static_cast<float>(last_size_.width()) * 2.0f - 1.0f; 759 static_cast<float>(size().width()) * 2.0f - 1.0f;
777 float max_x = 760 float max_x =
778 x + bounds.width() / static_cast<float>(last_size_.width()) * 2.0f; 761 x + bounds.width() / static_cast<float>(size().width()) * 2.0f;
779 float y = 762 float y =
780 static_cast<float>(last_size_.height() - bounds.y() - bounds.height()) / 763 static_cast<float>(size().height() - bounds.y() - bounds.height()) /
781 static_cast<float>(last_size_.height()) * 2.0f - 1.0f; 764 static_cast<float>(size().height()) * 2.0f - 1.0f;
782 float max_y = 765 float max_y =
783 y + bounds.height() / static_cast<float>(last_size_.height()) * 2.0f; 766 y + bounds.height() / static_cast<float>(size().height()) * 2.0f;
784 float tex_x = x / 2.0f + .5f; 767 float tex_x = x / 2.0f + .5f;
785 float max_tex_x = max_x / 2.0f + .5f; 768 float max_tex_x = max_x / 2.0f + .5f;
786 float tex_y = 1.0f - (max_y + 1.0f) / 2.0f; 769 float tex_y = 1.0f - (max_y + 1.0f) / 2.0f;
787 float max_tex_y = tex_y + (max_y - y) / 2.0f; 770 float max_tex_y = tex_y + (max_y - y) / 2.0f;
788 Vertex vertices[] = { 771 Vertex vertices[] = {
789 { D3DXVECTOR3( x, y, 0.0f), D3DXVECTOR2( tex_x, max_tex_y) }, 772 { D3DXVECTOR3( x, y, 0.0f), D3DXVECTOR2( tex_x, max_tex_y) },
790 { D3DXVECTOR3( x, max_y, 0.0f), D3DXVECTOR2( tex_x, tex_y) }, 773 { D3DXVECTOR3( x, max_y, 0.0f), D3DXVECTOR2( tex_x, tex_y) },
791 { D3DXVECTOR3(max_x, max_y, 0.0f), D3DXVECTOR2(max_tex_x, tex_y) }, 774 { D3DXVECTOR3(max_x, max_y, 0.0f), D3DXVECTOR2(max_tex_x, tex_y) },
792 { D3DXVECTOR3(max_x, y, 0.0f), D3DXVECTOR2(max_tex_x, max_tex_y) }, 775 { D3DXVECTOR3(max_x, y, 0.0f), D3DXVECTOR2(max_tex_x, max_tex_y) },
793 }; 776 };
(...skipping 22 matching lines...) Expand all
816 799
817 // static 800 // static
818 Compositor* Compositor::Create(gfx::AcceleratedWidget widget, 801 Compositor* Compositor::Create(gfx::AcceleratedWidget widget,
819 const gfx::Size& size) { 802 const gfx::Size& size) {
820 CompositorWin* compositor = new CompositorWin(widget, size); 803 CompositorWin* compositor = new CompositorWin(widget, size);
821 compositor->Init(); 804 compositor->Init();
822 return compositor; 805 return compositor;
823 } 806 }
824 807
825 } // namespace ui 808 } // namespace ui
OLDNEW
« no previous file with comments | « ui/gfx/compositor/compositor_gl.cc ('k') | ui/gfx/compositor/layer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698