OLD | NEW |
| (Empty) |
1 // Copyright 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 #include "config.h" | |
6 | |
7 #include "TextureCopier.h" | |
8 | |
9 #include "CCRendererGL.h" // For the GLC() macro. | |
10 #include "GraphicsContext3D.h" | |
11 #include "TraceEvent.h" | |
12 #include <public/WebGraphicsContext3D.h> | |
13 | |
14 namespace cc { | |
15 | |
16 #if USE(ACCELERATED_COMPOSITING) | |
17 AcceleratedTextureCopier::AcceleratedTextureCopier(WebKit::WebGraphicsContext3D*
context, bool usingBindUniforms) | |
18 : m_context(context) | |
19 , m_usingBindUniforms(usingBindUniforms) | |
20 { | |
21 ASSERT(m_context); | |
22 GLC(m_context, m_fbo = m_context->createFramebuffer()); | |
23 GLC(m_context, m_positionBuffer = m_context->createBuffer()); | |
24 | |
25 static const float kPositions[4][4] = { | |
26 {-1, -1, 0, 1}, | |
27 { 1, -1, 0, 1}, | |
28 { 1, 1, 0, 1}, | |
29 {-1, 1, 0, 1} | |
30 }; | |
31 | |
32 GLC(m_context, m_context->bindBuffer(GraphicsContext3D::ARRAY_BUFFER, m_posi
tionBuffer)); | |
33 GLC(m_context, m_context->bufferData(GraphicsContext3D::ARRAY_BUFFER, sizeof
(kPositions), kPositions, GraphicsContext3D::STATIC_DRAW)); | |
34 GLC(m_context, m_context->bindBuffer(GraphicsContext3D::ARRAY_BUFFER, 0)); | |
35 | |
36 m_blitProgram = adoptPtr(new BlitProgram(m_context)); | |
37 } | |
38 | |
39 AcceleratedTextureCopier::~AcceleratedTextureCopier() | |
40 { | |
41 if (m_blitProgram) | |
42 m_blitProgram->cleanup(m_context); | |
43 if (m_positionBuffer) | |
44 GLC(m_context, m_context->deleteBuffer(m_positionBuffer)); | |
45 if (m_fbo) | |
46 GLC(m_context, m_context->deleteFramebuffer(m_fbo)); | |
47 } | |
48 | |
49 void AcceleratedTextureCopier::copyTexture(Parameters parameters) | |
50 { | |
51 TRACE_EVENT0("cc", "TextureCopier::copyTexture"); | |
52 | |
53 // Note: this code does not restore the viewport, bound program, 2D texture,
framebuffer, buffer or blend enable. | |
54 GLC(m_context, m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, m_
fbo)); | |
55 GLC(m_context, m_context->framebufferTexture2D(GraphicsContext3D::FRAMEBUFFE
R, GraphicsContext3D::COLOR_ATTACHMENT0, GraphicsContext3D::TEXTURE_2D, paramete
rs.destTexture, 0)); | |
56 | |
57 #if OS(ANDROID) | |
58 // Clear destination to improve performance on tiling GPUs. | |
59 // TODO: Use EXT_discard_framebuffer or skip clearing if it isn't available. | |
60 GLC(m_context, m_context->clear(GraphicsContext3D::COLOR_BUFFER_BIT)); | |
61 #endif | |
62 | |
63 GLC(m_context, m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, paramet
ers.sourceTexture)); | |
64 GLC(m_context, m_context->texParameteri(GraphicsContext3D::TEXTURE_2D, Graph
icsContext3D::TEXTURE_MIN_FILTER, GraphicsContext3D::NEAREST)); | |
65 GLC(m_context, m_context->texParameteri(GraphicsContext3D::TEXTURE_2D, Graph
icsContext3D::TEXTURE_MAG_FILTER, GraphicsContext3D::NEAREST)); | |
66 | |
67 if (!m_blitProgram->initialized()) | |
68 m_blitProgram->initialize(m_context, m_usingBindUniforms); | |
69 | |
70 // TODO: Use EXT_framebuffer_blit if available. | |
71 GLC(m_context, m_context->useProgram(m_blitProgram->program())); | |
72 | |
73 const int kPositionAttribute = 0; | |
74 GLC(m_context, m_context->bindBuffer(GraphicsContext3D::ARRAY_BUFFER, m_posi
tionBuffer)); | |
75 GLC(m_context, m_context->vertexAttribPointer(kPositionAttribute, 4, Graphic
sContext3D::FLOAT, false, 0, 0)); | |
76 GLC(m_context, m_context->enableVertexAttribArray(kPositionAttribute)); | |
77 GLC(m_context, m_context->bindBuffer(GraphicsContext3D::ARRAY_BUFFER, 0)); | |
78 | |
79 GLC(m_context, m_context->viewport(0, 0, parameters.size.width(), parameters
.size.height())); | |
80 GLC(m_context, m_context->disable(GraphicsContext3D::BLEND)); | |
81 GLC(m_context, m_context->drawArrays(GraphicsContext3D::TRIANGLE_FAN, 0, 4))
; | |
82 | |
83 GLC(m_context, m_context->texParameteri(GraphicsContext3D::TEXTURE_2D, Graph
icsContext3D::TEXTURE_MIN_FILTER, GraphicsContext3D::LINEAR)); | |
84 GLC(m_context, m_context->texParameteri(GraphicsContext3D::TEXTURE_2D, Graph
icsContext3D::TEXTURE_MAG_FILTER, GraphicsContext3D::LINEAR)); | |
85 GLC(m_context, m_context->disableVertexAttribArray(kPositionAttribute)); | |
86 | |
87 GLC(m_context, m_context->useProgram(0)); | |
88 | |
89 GLC(m_context, m_context->framebufferTexture2D(GraphicsContext3D::FRAMEBUFFE
R, GraphicsContext3D::COLOR_ATTACHMENT0, GraphicsContext3D::TEXTURE_2D, 0, 0)); | |
90 GLC(m_context, m_context->bindFramebuffer(GraphicsContext3D::FRAMEBUFFER, 0)
); | |
91 GLC(m_context, m_context->bindTexture(GraphicsContext3D::TEXTURE_2D, 0)); | |
92 } | |
93 | |
94 void AcceleratedTextureCopier::flush() | |
95 { | |
96 GLC(m_context, m_context->flush()); | |
97 } | |
98 | |
99 } | |
100 | |
101 #endif // USE(ACCELERATED_COMPOSITING) | |
OLD | NEW |