OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "config.h" | 5 #include "config.h" |
6 #include "modules/webgl/WebGL2RenderingContextBase.h" | 6 #include "modules/webgl/WebGL2RenderingContextBase.h" |
7 | 7 |
8 #include "bindings/modules/v8/WebGLAny.h" | 8 #include "bindings/modules/v8/WebGLAny.h" |
9 #include "core/html/HTMLCanvasElement.h" | 9 #include "core/html/HTMLCanvasElement.h" |
10 #include "core/html/HTMLImageElement.h" | 10 #include "core/html/HTMLImageElement.h" |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
77 | 77 |
78 m_max3DTextureSize = 0; | 78 m_max3DTextureSize = 0; |
79 webContext()->getIntegerv(GL_MAX_3D_TEXTURE_SIZE, &m_max3DTextureSize); | 79 webContext()->getIntegerv(GL_MAX_3D_TEXTURE_SIZE, &m_max3DTextureSize); |
80 m_max3DTextureLevel = WebGLTexture::computeLevelCount(m_max3DTextureSize, m_ max3DTextureSize, m_max3DTextureSize); | 80 m_max3DTextureLevel = WebGLTexture::computeLevelCount(m_max3DTextureSize, m_ max3DTextureSize, m_max3DTextureSize); |
81 | 81 |
82 GLint numCombinedTextureImageUnits = 0; | 82 GLint numCombinedTextureImageUnits = 0; |
83 webContext()->getIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &numCombinedT extureImageUnits); | 83 webContext()->getIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &numCombinedT extureImageUnits); |
84 m_samplerUnits.clear(); | 84 m_samplerUnits.clear(); |
85 m_samplerUnits.resize(numCombinedTextureImageUnits); | 85 m_samplerUnits.resize(numCombinedTextureImageUnits); |
86 | 86 |
87 GLint maxTransformFeedbackSeparateAttribs = 0; | |
88 webContext()->getIntegerv(GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS, &maxTr ansformFeedbackSeparateAttribs); | |
89 m_boundIndexedTransformFeedbackBuffers.clear(); | |
90 m_boundIndexedTransformFeedbackBuffers.resize(maxTransformFeedbackSeparateAt tribs); | |
91 | |
92 GLint maxUniformBufferBindings = 0; | |
93 webContext()->getIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, &maxUniformBufferB indings); | |
94 m_boundIndexedUniformBuffers.clear(); | |
95 m_boundIndexedUniformBuffers.resize(maxUniformBufferBindings); | |
96 | |
87 WebGLRenderingContextBase::initializeNewContext(); | 97 WebGLRenderingContextBase::initializeNewContext(); |
88 } | 98 } |
89 | 99 |
90 void WebGL2RenderingContextBase::copyBufferSubData(GLenum readTarget, GLenum wri teTarget, long long readOffset, long long writeOffset, long long size) | 100 void WebGL2RenderingContextBase::copyBufferSubData(GLenum readTarget, GLenum wri teTarget, long long readOffset, long long writeOffset, long long size) |
91 { | 101 { |
92 if (isContextLost()) | 102 if (isContextLost()) |
93 return; | 103 return; |
94 | 104 |
95 if (!validateValueFitNonNegInt32("copyBufferSubData", "readOffset", readOffs et) | 105 if (!validateValueFitNonNegInt32("copyBufferSubData", "readOffset", readOffs et) |
96 || !validateValueFitNonNegInt32("copyBufferSubData", "writeOffset", writ eOffset) | 106 || !validateValueFitNonNegInt32("copyBufferSubData", "writeOffset", writ eOffset) |
(...skipping 1546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1643 | 1653 |
1644 void WebGL2RenderingContextBase::bindBufferBase(GLenum target, GLuint index, Web GLBuffer* buffer) | 1654 void WebGL2RenderingContextBase::bindBufferBase(GLenum target, GLuint index, Web GLBuffer* buffer) |
1645 { | 1655 { |
1646 if (isContextLost()) | 1656 if (isContextLost()) |
1647 return; | 1657 return; |
1648 bool deleted; | 1658 bool deleted; |
1649 if (!checkObjectToBeBound("bindBufferBase", buffer, deleted)) | 1659 if (!checkObjectToBeBound("bindBufferBase", buffer, deleted)) |
1650 return; | 1660 return; |
1651 if (deleted) | 1661 if (deleted) |
1652 buffer = 0; | 1662 buffer = 0; |
1663 if (!validateAndUpdateBufferBindBaseTarget("bindBufferBase", target, index, buffer)) | |
1664 return; | |
1653 webContext()->bindBufferBase(target, index, objectOrZero(buffer)); | 1665 webContext()->bindBufferBase(target, index, objectOrZero(buffer)); |
1654 } | 1666 } |
1655 | 1667 |
1656 void WebGL2RenderingContextBase::bindBufferRange(GLenum target, GLuint index, We bGLBuffer* buffer, long long offset, long long size) | 1668 void WebGL2RenderingContextBase::bindBufferRange(GLenum target, GLuint index, We bGLBuffer* buffer, long long offset, long long size) |
1657 { | 1669 { |
1658 if (isContextLost() || !validateWebGLObject("bindBufferRange", buffer)) | 1670 if (isContextLost()) |
1659 return; | 1671 return; |
1660 | 1672 bool deleted; |
1673 if (!checkObjectToBeBound("bindBufferRange", buffer, deleted)) | |
1674 return; | |
1675 if (deleted) | |
1676 buffer = 0; | |
1661 if (!validateValueFitNonNegInt32("bindBufferRange", "offset", offset) | 1677 if (!validateValueFitNonNegInt32("bindBufferRange", "offset", offset) |
1662 || !validateValueFitNonNegInt32("bindBufferRange", "size", size)) { | 1678 || !validateValueFitNonNegInt32("bindBufferRange", "size", size)) { |
1663 return; | 1679 return; |
1664 } | 1680 } |
1665 | 1681 |
1682 if (!validateAndUpdateBufferBindBaseTarget("bindBufferRange", target, index, buffer)) | |
1683 return; | |
1684 | |
1666 webContext()->bindBufferRange(target, index, objectOrZero(buffer), static_ca st<GLintptr>(offset), static_cast<GLsizeiptr>(size)); | 1685 webContext()->bindBufferRange(target, index, objectOrZero(buffer), static_ca st<GLintptr>(offset), static_cast<GLsizeiptr>(size)); |
1667 } | 1686 } |
1668 | 1687 |
1669 ScriptValue WebGL2RenderingContextBase::getIndexedParameter(ScriptState* scriptS tate, GLenum target, GLuint index) | 1688 ScriptValue WebGL2RenderingContextBase::getIndexedParameter(ScriptState* scriptS tate, GLenum target, GLuint index) |
1670 { | 1689 { |
1671 if (isContextLost()) | 1690 if (isContextLost()) |
1672 return ScriptValue::createNull(scriptState); | 1691 return ScriptValue::createNull(scriptState); |
1673 | 1692 |
1674 switch (target) { | 1693 switch (target) { |
1675 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: | 1694 case GL_TRANSFORM_FEEDBACK_BUFFER_BINDING: |
1695 if (index >= m_boundIndexedTransformFeedbackBuffers.size()) { | |
1696 synthesizeGLError(GL_INVALID_VALUE, "getIndexedParameter", "index ou t of range"); | |
1697 return ScriptValue::createNull(scriptState); | |
1698 } | |
1699 return WebGLAny(scriptState, m_boundIndexedTransformFeedbackBuffers[inde x].get()); | |
1676 case GL_UNIFORM_BUFFER_BINDING: | 1700 case GL_UNIFORM_BUFFER_BINDING: |
1677 notImplemented(); | 1701 if (index >= m_boundIndexedUniformBuffers.size()) { |
1678 return ScriptValue::createNull(scriptState); | 1702 synthesizeGLError(GL_INVALID_VALUE, "getIndexedParameter", "index ou t of range"); |
1703 return ScriptValue::createNull(scriptState); | |
1704 } | |
1705 return WebGLAny(scriptState, m_boundIndexedUniformBuffers[index].get()); | |
1679 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE: | 1706 case GL_TRANSFORM_FEEDBACK_BUFFER_SIZE: |
1680 case GL_TRANSFORM_FEEDBACK_BUFFER_START: | 1707 case GL_TRANSFORM_FEEDBACK_BUFFER_START: |
1681 case GL_UNIFORM_BUFFER_SIZE: | 1708 case GL_UNIFORM_BUFFER_SIZE: |
1682 case GL_UNIFORM_BUFFER_START: | 1709 case GL_UNIFORM_BUFFER_START: |
1683 { | 1710 { |
1684 GLint64 value = -1; | 1711 GLint64 value = -1; |
1685 webContext()->getInteger64i_v(target, index, &value); | 1712 webContext()->getInteger64i_v(target, index, &value); |
1686 return WebGLAny(scriptState, value); | 1713 return WebGLAny(scriptState, value); |
1687 } | 1714 } |
1688 default: | 1715 default: |
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2048 bool WebGL2RenderingContextBase::validateCapability(const char* functionName, GL enum cap) | 2075 bool WebGL2RenderingContextBase::validateCapability(const char* functionName, GL enum cap) |
2049 { | 2076 { |
2050 switch (cap) { | 2077 switch (cap) { |
2051 case GL_RASTERIZER_DISCARD: | 2078 case GL_RASTERIZER_DISCARD: |
2052 return true; | 2079 return true; |
2053 default: | 2080 default: |
2054 return WebGLRenderingContextBase::validateCapability(functionName, cap); | 2081 return WebGLRenderingContextBase::validateCapability(functionName, cap); |
2055 } | 2082 } |
2056 } | 2083 } |
2057 | 2084 |
2085 bool WebGL2RenderingContextBase::isBufferBoundToTransformFeedback(WebGLBuffer* b uffer) | |
2086 { | |
2087 ASSERT(buffer); | |
2088 | |
2089 if (m_boundTransformFeedbackBuffer == buffer) | |
2090 return true; | |
2091 | |
2092 for (size_t i = 0; i < m_boundIndexedTransformFeedbackBuffers.size(); ++i) { | |
Ken Russell (switch to Gerrit)
2015/09/04 20:51:31
Any idea how large this array is in practice? Conc
| |
2093 if (m_boundIndexedTransformFeedbackBuffers[i] == buffer) { | |
2094 return true; | |
2095 } | |
2096 } | |
2097 | |
2098 return false; | |
2099 } | |
2100 | |
2101 bool WebGL2RenderingContextBase::isBufferBoundToNonTransformFeedback(WebGLBuffer * buffer) | |
2102 { | |
2103 ASSERT(buffer); | |
2104 | |
2105 if (m_boundArrayBuffer == buffer | |
2106 || m_boundVertexArrayObject->boundElementArrayBuffer() == buffer | |
2107 || m_boundCopyReadBuffer == buffer | |
2108 || m_boundCopyWriteBuffer == buffer | |
2109 || m_boundPixelPackBuffer == buffer | |
2110 || m_boundPixelUnpackBuffer == buffer | |
2111 || m_boundUniformBuffer == buffer) { | |
2112 return true; | |
2113 } | |
2114 | |
2115 for (size_t i = 0; i < m_boundIndexedUniformBuffers.size(); ++i) { | |
Ken Russell (switch to Gerrit)
2015/09/04 20:51:31
Same concern here.
| |
2116 if (m_boundIndexedUniformBuffers[i] == buffer) { | |
2117 return true; | |
2118 } | |
2119 } | |
2120 | |
2121 return false; | |
2122 } | |
2123 | |
2124 bool WebGL2RenderingContextBase::validateBufferTargetCompatiblity(const char* fu nctionName, GLenum target, WebGLBuffer* buffer) | |
2125 { | |
2126 ASSERT(buffer); | |
2127 | |
2128 switch (buffer->getInitialTarget()) { | |
2129 case GL_ELEMENT_ARRAY_BUFFER: | |
2130 switch (target) { | |
2131 case GL_ARRAY_BUFFER: | |
2132 case GL_PIXEL_PACK_BUFFER: | |
2133 case GL_PIXEL_UNPACK_BUFFER: | |
2134 case GL_TRANSFORM_FEEDBACK_BUFFER: | |
2135 case GL_UNIFORM_BUFFER: | |
2136 synthesizeGLError(GL_INVALID_OPERATION, functionName, | |
2137 "element array buffers can not be bound to a different target"); | |
2138 | |
2139 return false; | |
2140 default: | |
2141 break; | |
2142 } | |
2143 break; | |
2144 case GL_ARRAY_BUFFER: | |
2145 case GL_COPY_READ_BUFFER: | |
2146 case GL_COPY_WRITE_BUFFER: | |
2147 case GL_PIXEL_PACK_BUFFER: | |
2148 case GL_PIXEL_UNPACK_BUFFER: | |
2149 case GL_UNIFORM_BUFFER: | |
2150 case GL_TRANSFORM_FEEDBACK_BUFFER: | |
2151 if (target == GL_ELEMENT_ARRAY_BUFFER) { | |
2152 synthesizeGLError(GL_INVALID_OPERATION, functionName, | |
2153 "buffers bound to non ELEMENT_ARRAY_BUFFER targets can not be bo und to ELEMENT_ARRAY_BUFFER target"); | |
2154 return false; | |
2155 } | |
2156 break; | |
2157 default: | |
2158 break; | |
2159 } | |
2160 | |
2161 if (target == GL_TRANSFORM_FEEDBACK_BUFFER) { | |
2162 if (isBufferBoundToNonTransformFeedback(buffer)) { | |
2163 synthesizeGLError(GL_INVALID_OPERATION, functionName, | |
2164 "a buffer bound to TRANSFORM_FEEDBACK_BUFFER can not be bound to any other targets"); | |
2165 return false; | |
2166 } | |
2167 } else if (isBufferBoundToTransformFeedback(buffer)) { | |
2168 synthesizeGLError(GL_INVALID_OPERATION, functionName, | |
2169 "a buffer bound to TRANSFORM_FEEDBACK_BUFFER can not be bound to any other targets"); | |
2170 return false; | |
2171 } | |
2172 | |
2173 return true; | |
2174 } | |
2175 | |
2058 bool WebGL2RenderingContextBase::validateBufferTarget(const char* functionName, GLenum target) | 2176 bool WebGL2RenderingContextBase::validateBufferTarget(const char* functionName, GLenum target) |
2059 { | 2177 { |
2060 switch (target) { | 2178 switch (target) { |
2061 case GL_ARRAY_BUFFER: | 2179 case GL_ARRAY_BUFFER: |
2062 case GL_COPY_READ_BUFFER: | 2180 case GL_COPY_READ_BUFFER: |
2063 case GL_COPY_WRITE_BUFFER: | 2181 case GL_COPY_WRITE_BUFFER: |
2064 case GL_ELEMENT_ARRAY_BUFFER: | 2182 case GL_ELEMENT_ARRAY_BUFFER: |
2065 case GL_PIXEL_PACK_BUFFER: | 2183 case GL_PIXEL_PACK_BUFFER: |
2066 case GL_PIXEL_UNPACK_BUFFER: | 2184 case GL_PIXEL_UNPACK_BUFFER: |
2067 case GL_TRANSFORM_FEEDBACK_BUFFER: | 2185 case GL_TRANSFORM_FEEDBACK_BUFFER: |
2068 case GL_UNIFORM_BUFFER: | 2186 case GL_UNIFORM_BUFFER: |
2069 return true; | 2187 return true; |
2070 default: | 2188 default: |
2071 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid target"); | 2189 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid target"); |
2072 return false; | 2190 return false; |
2073 } | 2191 } |
2074 } | 2192 } |
2075 | 2193 |
2076 bool WebGL2RenderingContextBase::validateAndUpdateBufferBindTarget(const char* f unctionName, GLenum target, WebGLBuffer* buffer) | 2194 bool WebGL2RenderingContextBase::validateAndUpdateBufferBindTarget(const char* f unctionName, GLenum target, WebGLBuffer* buffer) |
2077 { | 2195 { |
2078 if (!validateBufferTarget(functionName, target)) | 2196 if (!validateBufferTarget(functionName, target)) |
2079 return false; | 2197 return false; |
2080 | 2198 |
2081 if (buffer) { | 2199 if (buffer && !validateBufferTargetCompatiblity(functionName, target, buffer )) |
2082 switch (buffer->getInitialTarget()) { | 2200 return false; |
2083 case GL_ELEMENT_ARRAY_BUFFER: | |
2084 switch (target) { | |
2085 case GL_ARRAY_BUFFER: | |
2086 case GL_PIXEL_PACK_BUFFER: | |
2087 case GL_PIXEL_UNPACK_BUFFER: | |
2088 case GL_TRANSFORM_FEEDBACK_BUFFER: | |
2089 case GL_UNIFORM_BUFFER: | |
2090 synthesizeGLError(GL_INVALID_OPERATION, functionName, | |
2091 "element array buffers can not be bound to a different targe t"); | |
2092 | |
2093 return false; | |
2094 default: | |
2095 break; | |
2096 } | |
2097 break; | |
2098 case GL_ARRAY_BUFFER: | |
2099 case GL_COPY_READ_BUFFER: | |
2100 case GL_COPY_WRITE_BUFFER: | |
2101 case GL_PIXEL_PACK_BUFFER: | |
2102 case GL_PIXEL_UNPACK_BUFFER: | |
2103 case GL_UNIFORM_BUFFER: | |
2104 case GL_TRANSFORM_FEEDBACK_BUFFER: | |
2105 if (target == GL_ELEMENT_ARRAY_BUFFER) { | |
2106 synthesizeGLError(GL_INVALID_OPERATION, functionName, | |
2107 "buffers bound to non ELEMENT_ARRAY_BUFFER targets can not b e bound to ELEMENT_ARRAY_BUFFER target"); | |
2108 return false; | |
2109 } | |
2110 break; | |
2111 default: | |
2112 break; | |
2113 } | |
2114 if (target == GL_TRANSFORM_FEEDBACK_BUFFER) { | |
2115 if (m_boundArrayBuffer == buffer | |
2116 || m_boundVertexArrayObject->boundElementArrayBuffer() == buffer | |
2117 || m_boundCopyReadBuffer == buffer | |
2118 || m_boundCopyWriteBuffer == buffer | |
2119 || m_boundPixelPackBuffer == buffer | |
2120 || m_boundPixelUnpackBuffer == buffer | |
2121 || m_boundUniformBuffer == buffer) { | |
2122 synthesizeGLError(GL_INVALID_OPERATION, functionName, | |
2123 "a buffer bound to TRANSFORM_FEEDBACK_BUFFER can not be boun d to any other targets"); | |
2124 return false; | |
2125 } | |
2126 } else if (m_boundTransformFeedbackBuffer == buffer) { | |
2127 synthesizeGLError(GL_INVALID_OPERATION, functionName, | |
2128 "a buffer bound to TRANSFORM_FEEDBACK_BUFFER can not be bound to any other targets"); | |
2129 return false; | |
2130 } | |
2131 } | |
2132 | 2201 |
2133 switch (target) { | 2202 switch (target) { |
2134 case GL_ARRAY_BUFFER: | 2203 case GL_ARRAY_BUFFER: |
2135 m_boundArrayBuffer = buffer; | 2204 m_boundArrayBuffer = buffer; |
2136 break; | 2205 break; |
2137 case GL_COPY_READ_BUFFER: | 2206 case GL_COPY_READ_BUFFER: |
2138 m_boundCopyReadBuffer = buffer; | 2207 m_boundCopyReadBuffer = buffer; |
2139 break; | 2208 break; |
2140 case GL_COPY_WRITE_BUFFER: | 2209 case GL_COPY_WRITE_BUFFER: |
2141 m_boundCopyWriteBuffer = buffer; | 2210 m_boundCopyWriteBuffer = buffer; |
(...skipping 16 matching lines...) Expand all Loading... | |
2158 default: | 2227 default: |
2159 ASSERT_NOT_REACHED(); | 2228 ASSERT_NOT_REACHED(); |
2160 break; | 2229 break; |
2161 } | 2230 } |
2162 | 2231 |
2163 if (buffer && !buffer->getInitialTarget()) | 2232 if (buffer && !buffer->getInitialTarget()) |
2164 buffer->setInitialTarget(target); | 2233 buffer->setInitialTarget(target); |
2165 return true; | 2234 return true; |
2166 } | 2235 } |
2167 | 2236 |
2237 bool WebGL2RenderingContextBase::validateBufferBaseTarget(const char* functionNa me, GLenum target) | |
2238 { | |
2239 switch (target) { | |
2240 case GL_TRANSFORM_FEEDBACK_BUFFER: | |
2241 case GL_UNIFORM_BUFFER: | |
2242 return true; | |
2243 default: | |
2244 synthesizeGLError(GL_INVALID_ENUM, functionName, "invalid target"); | |
2245 return false; | |
2246 } | |
2247 } | |
2248 | |
2249 bool WebGL2RenderingContextBase::validateAndUpdateBufferBindBaseTarget(const cha r* functionName, GLenum target, GLuint index, WebGLBuffer* buffer) | |
2250 { | |
2251 if (!validateBufferBaseTarget(functionName, target)) | |
2252 return false; | |
2253 | |
2254 if (buffer && !validateBufferTargetCompatiblity(functionName, target, buffer )) | |
2255 return false; | |
2256 | |
2257 switch (target) { | |
2258 case GL_TRANSFORM_FEEDBACK_BUFFER: | |
2259 if (index >= m_boundIndexedTransformFeedbackBuffers.size()) { | |
2260 synthesizeGLError(GL_INVALID_OPERATION, functionName, "index out of range"); | |
2261 return false; | |
2262 } | |
2263 m_boundIndexedTransformFeedbackBuffers[index] = buffer; | |
2264 m_boundTransformFeedbackBuffer = buffer; | |
2265 break; | |
2266 case GL_UNIFORM_BUFFER: | |
2267 if (index >= m_boundIndexedUniformBuffers.size()) { | |
2268 synthesizeGLError(GL_INVALID_OPERATION, functionName, "index out of range"); | |
2269 return false; | |
2270 } | |
2271 m_boundIndexedUniformBuffers[index] = buffer; | |
2272 m_boundUniformBuffer = buffer; | |
2273 break; | |
2274 default: | |
2275 ASSERT_NOT_REACHED(); | |
2276 break; | |
2277 } | |
2278 | |
2279 if (buffer && !buffer->getInitialTarget()) | |
2280 buffer->setInitialTarget(target); | |
2281 return true; | |
2282 } | |
2283 | |
2168 bool WebGL2RenderingContextBase::validateFramebufferTarget(GLenum target) | 2284 bool WebGL2RenderingContextBase::validateFramebufferTarget(GLenum target) |
2169 { | 2285 { |
2170 switch (target) { | 2286 switch (target) { |
2171 case GL_FRAMEBUFFER: | 2287 case GL_FRAMEBUFFER: |
2172 case GL_READ_FRAMEBUFFER: | 2288 case GL_READ_FRAMEBUFFER: |
2173 case GL_DRAW_FRAMEBUFFER: | 2289 case GL_DRAW_FRAMEBUFFER: |
2174 return true; | 2290 return true; |
2175 default: | 2291 default: |
2176 return false; | 2292 return false; |
2177 } | 2293 } |
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2545 GLenum WebGL2RenderingContextBase::boundFramebufferColorFormat() | 2661 GLenum WebGL2RenderingContextBase::boundFramebufferColorFormat() |
2546 { | 2662 { |
2547 if (m_readFramebufferBinding && m_readFramebufferBinding->object()) | 2663 if (m_readFramebufferBinding && m_readFramebufferBinding->object()) |
2548 return m_readFramebufferBinding->colorBufferFormat(); | 2664 return m_readFramebufferBinding->colorBufferFormat(); |
2549 if (m_requestedAttributes.alpha()) | 2665 if (m_requestedAttributes.alpha()) |
2550 return GL_RGBA; | 2666 return GL_RGBA; |
2551 return GL_RGB; | 2667 return GL_RGB; |
2552 } | 2668 } |
2553 | 2669 |
2554 } // namespace blink | 2670 } // namespace blink |
OLD | NEW |