OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2009 Apple Inc. All rights reserved. | 2 * Copyright (C) 2009 Apple Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 2041 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2052 return; | 2052 return; |
2053 } | 2053 } |
2054 // Don't allow the default framebuffer to be mutated; all current | 2054 // Don't allow the default framebuffer to be mutated; all current |
2055 // implementations use an FBO internally in place of the default | 2055 // implementations use an FBO internally in place of the default |
2056 // FBO. | 2056 // FBO. |
2057 if (!m_framebufferBinding || !m_framebufferBinding->object()) { | 2057 if (!m_framebufferBinding || !m_framebufferBinding->object()) { |
2058 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "framebufferRend
erbuffer", "no framebuffer bound"); | 2058 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "framebufferRend
erbuffer", "no framebuffer bound"); |
2059 return; | 2059 return; |
2060 } | 2060 } |
2061 Platform3DObject bufferObject = objectOrZero(buffer); | 2061 Platform3DObject bufferObject = objectOrZero(buffer); |
2062 bool reattachDepth = false; | |
2063 bool reattachStencil = false; | |
2064 bool reattachDepthStencilDepth = false; | |
2065 bool reattachDepthStencilStencil = false; | |
2066 switch (attachment) { | 2062 switch (attachment) { |
2067 case GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT: | 2063 case GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT: |
2068 m_context->framebufferRenderbuffer(target, GraphicsContext3D::DEPTH_ATTA
CHMENT, renderbuffertarget, bufferObject); | 2064 m_context->framebufferRenderbuffer(target, GraphicsContext3D::DEPTH_ATTA
CHMENT, renderbuffertarget, bufferObject); |
2069 m_context->framebufferRenderbuffer(target, GraphicsContext3D::STENCIL_AT
TACHMENT, renderbuffertarget, bufferObject); | 2065 m_context->framebufferRenderbuffer(target, GraphicsContext3D::STENCIL_AT
TACHMENT, renderbuffertarget, bufferObject); |
2070 if (!bufferObject) { | |
2071 reattachDepth = true; | |
2072 reattachStencil = true; | |
2073 } | |
2074 break; | 2066 break; |
2075 case GraphicsContext3D::DEPTH_ATTACHMENT: | 2067 case GraphicsContext3D::DEPTH_ATTACHMENT: |
2076 m_context->framebufferRenderbuffer(target, attachment, renderbuffertarge
t, bufferObject); | 2068 m_context->framebufferRenderbuffer(target, attachment, renderbuffertarge
t, bufferObject); |
2077 if (!bufferObject) | |
2078 reattachDepthStencilDepth = true; | |
2079 break; | 2069 break; |
2080 case GraphicsContext3D::STENCIL_ATTACHMENT: | 2070 case GraphicsContext3D::STENCIL_ATTACHMENT: |
2081 m_context->framebufferRenderbuffer(target, attachment, renderbuffertarge
t, bufferObject); | 2071 m_context->framebufferRenderbuffer(target, attachment, renderbuffertarge
t, bufferObject); |
2082 if (!bufferObject) | |
2083 reattachDepthStencilStencil = true; | |
2084 break; | 2072 break; |
2085 default: | 2073 default: |
2086 m_context->framebufferRenderbuffer(target, attachment, renderbuffertarge
t, bufferObject); | 2074 m_context->framebufferRenderbuffer(target, attachment, renderbuffertarge
t, bufferObject); |
2087 } | 2075 } |
2088 m_framebufferBinding->setAttachmentForBoundFramebuffer(attachment, buffer); | 2076 m_framebufferBinding->setAttachmentForBoundFramebuffer(attachment, buffer); |
2089 reattachDepthStencilAttachments(reattachDepth, reattachStencil, reattachDept
hStencilDepth, reattachDepthStencilStencil); | |
2090 applyStencilTest(); | 2077 applyStencilTest(); |
2091 cleanupAfterGraphicsCall(false); | 2078 cleanupAfterGraphicsCall(false); |
2092 } | 2079 } |
2093 | 2080 |
2094 void WebGLRenderingContext::reattachDepthStencilAttachments(bool reattachDepth,
bool reattachStencil, bool reattachDepthStencilDepth, bool reattachDepthStencilS
tencil) | |
2095 { | |
2096 if (reattachDepth) | |
2097 m_framebufferBinding->attach(GraphicsContext3D::DEPTH_ATTACHMENT, Graphi
csContext3D::DEPTH_ATTACHMENT); | |
2098 if (reattachStencil) | |
2099 m_framebufferBinding->attach(GraphicsContext3D::STENCIL_ATTACHMENT, Grap
hicsContext3D::STENCIL_ATTACHMENT); | |
2100 if (reattachDepthStencilDepth) | |
2101 m_framebufferBinding->attach(GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT
, GraphicsContext3D::DEPTH_ATTACHMENT); | |
2102 if (reattachDepthStencilStencil) | |
2103 m_framebufferBinding->attach(GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT
, GraphicsContext3D::STENCIL_ATTACHMENT); | |
2104 } | |
2105 | |
2106 void WebGLRenderingContext::framebufferTexture2D(GC3Denum target, GC3Denum attac
hment, GC3Denum textarget, WebGLTexture* texture, GC3Dint level, ExceptionCode&
ec) | 2081 void WebGLRenderingContext::framebufferTexture2D(GC3Denum target, GC3Denum attac
hment, GC3Denum textarget, WebGLTexture* texture, GC3Dint level, ExceptionCode&
ec) |
2107 { | 2082 { |
2108 UNUSED_PARAM(ec); | 2083 UNUSED_PARAM(ec); |
2109 if (isContextLost() || !validateFramebufferFuncParameters("framebufferTextur
e2D", target, attachment)) | 2084 if (isContextLost() || !validateFramebufferFuncParameters("framebufferTextur
e2D", target, attachment)) |
2110 return; | 2085 return; |
2111 if (level) { | 2086 if (level) { |
2112 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "framebufferTexture2
D", "level not 0"); | 2087 synthesizeGLError(GraphicsContext3D::INVALID_VALUE, "framebufferTexture2
D", "level not 0"); |
2113 return; | 2088 return; |
2114 } | 2089 } |
2115 if (texture && !texture->validate(contextGroup(), this)) { | 2090 if (texture && !texture->validate(contextGroup(), this)) { |
2116 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "framebufferText
ure2D", "no texture or texture not from this context"); | 2091 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "framebufferText
ure2D", "no texture or texture not from this context"); |
2117 return; | 2092 return; |
2118 } | 2093 } |
2119 // Don't allow the default framebuffer to be mutated; all current | 2094 // Don't allow the default framebuffer to be mutated; all current |
2120 // implementations use an FBO internally in place of the default | 2095 // implementations use an FBO internally in place of the default |
2121 // FBO. | 2096 // FBO. |
2122 if (!m_framebufferBinding || !m_framebufferBinding->object()) { | 2097 if (!m_framebufferBinding || !m_framebufferBinding->object()) { |
2123 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "framebufferText
ure2D", "no framebuffer bound"); | 2098 synthesizeGLError(GraphicsContext3D::INVALID_OPERATION, "framebufferText
ure2D", "no framebuffer bound"); |
2124 return; | 2099 return; |
2125 } | 2100 } |
2126 Platform3DObject textureObject = objectOrZero(texture); | 2101 Platform3DObject textureObject = objectOrZero(texture); |
2127 bool reattachDepth = false; | |
2128 bool reattachStencil = false; | |
2129 bool reattachDepthStencilDepth = false; | |
2130 bool reattachDepthStencilStencil = false; | |
2131 switch (attachment) { | 2102 switch (attachment) { |
2132 case GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT: | 2103 case GraphicsContext3D::DEPTH_STENCIL_ATTACHMENT: |
2133 m_context->framebufferTexture2D(target, GraphicsContext3D::DEPTH_ATTACHM
ENT, textarget, textureObject, level); | 2104 m_context->framebufferTexture2D(target, GraphicsContext3D::DEPTH_ATTACHM
ENT, textarget, textureObject, level); |
2134 m_context->framebufferTexture2D(target, GraphicsContext3D::STENCIL_ATTAC
HMENT, textarget, textureObject, level); | 2105 m_context->framebufferTexture2D(target, GraphicsContext3D::STENCIL_ATTAC
HMENT, textarget, textureObject, level); |
2135 if (!textureObject) { | |
2136 reattachDepth = true; | |
2137 reattachStencil = true; | |
2138 } | |
2139 break; | 2106 break; |
2140 case GraphicsContext3D::DEPTH_ATTACHMENT: | 2107 case GraphicsContext3D::DEPTH_ATTACHMENT: |
2141 m_context->framebufferTexture2D(target, attachment, textarget, textureOb
ject, level); | 2108 m_context->framebufferTexture2D(target, attachment, textarget, textureOb
ject, level); |
2142 if (!textureObject) | |
2143 reattachDepthStencilDepth = true; | |
2144 break; | 2109 break; |
2145 case GraphicsContext3D::STENCIL_ATTACHMENT: | 2110 case GraphicsContext3D::STENCIL_ATTACHMENT: |
2146 m_context->framebufferTexture2D(target, attachment, textarget, textureOb
ject, level); | 2111 m_context->framebufferTexture2D(target, attachment, textarget, textureOb
ject, level); |
2147 if (!textureObject) | |
2148 reattachDepthStencilStencil = true; | |
2149 break; | 2112 break; |
2150 default: | 2113 default: |
2151 m_context->framebufferTexture2D(target, attachment, textarget, textureOb
ject, level); | 2114 m_context->framebufferTexture2D(target, attachment, textarget, textureOb
ject, level); |
2152 } | 2115 } |
2153 m_framebufferBinding->setAttachmentForBoundFramebuffer(attachment, textarget
, texture, level); | 2116 m_framebufferBinding->setAttachmentForBoundFramebuffer(attachment, textarget
, texture, level); |
2154 reattachDepthStencilAttachments(reattachDepth, reattachStencil, reattachDept
hStencilDepth, reattachDepthStencilStencil); | |
2155 applyStencilTest(); | 2117 applyStencilTest(); |
2156 cleanupAfterGraphicsCall(false); | 2118 cleanupAfterGraphicsCall(false); |
2157 } | 2119 } |
2158 | 2120 |
2159 void WebGLRenderingContext::frontFace(GC3Denum mode) | 2121 void WebGLRenderingContext::frontFace(GC3Denum mode) |
2160 { | 2122 { |
2161 if (isContextLost()) | 2123 if (isContextLost()) |
2162 return; | 2124 return; |
2163 m_context->frontFace(mode); | 2125 m_context->frontFace(mode); |
2164 cleanupAfterGraphicsCall(false); | 2126 cleanupAfterGraphicsCall(false); |
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2463 return getBooleanArrayParameter(pname); | 2425 return getBooleanArrayParameter(pname); |
2464 case GraphicsContext3D::COMPRESSED_TEXTURE_FORMATS: | 2426 case GraphicsContext3D::COMPRESSED_TEXTURE_FORMATS: |
2465 return WebGLGetInfo(Uint32Array::create(m_compressedTextureFormats.data(
), m_compressedTextureFormats.size())); | 2427 return WebGLGetInfo(Uint32Array::create(m_compressedTextureFormats.data(
), m_compressedTextureFormats.size())); |
2466 case GraphicsContext3D::CULL_FACE: | 2428 case GraphicsContext3D::CULL_FACE: |
2467 return getBooleanParameter(pname); | 2429 return getBooleanParameter(pname); |
2468 case GraphicsContext3D::CULL_FACE_MODE: | 2430 case GraphicsContext3D::CULL_FACE_MODE: |
2469 return getUnsignedIntParameter(pname); | 2431 return getUnsignedIntParameter(pname); |
2470 case GraphicsContext3D::CURRENT_PROGRAM: | 2432 case GraphicsContext3D::CURRENT_PROGRAM: |
2471 return WebGLGetInfo(PassRefPtr<WebGLProgram>(m_currentProgram)); | 2433 return WebGLGetInfo(PassRefPtr<WebGLProgram>(m_currentProgram)); |
2472 case GraphicsContext3D::DEPTH_BITS: | 2434 case GraphicsContext3D::DEPTH_BITS: |
2473 if (!m_attributes.depth) | 2435 if (!m_framebufferBinding && !m_attributes.depth) |
2474 return WebGLGetInfo(intZero); | 2436 return WebGLGetInfo(intZero); |
2475 return getIntParameter(pname); | 2437 return getIntParameter(pname); |
2476 case GraphicsContext3D::DEPTH_CLEAR_VALUE: | 2438 case GraphicsContext3D::DEPTH_CLEAR_VALUE: |
2477 return getFloatParameter(pname); | 2439 return getFloatParameter(pname); |
2478 case GraphicsContext3D::DEPTH_FUNC: | 2440 case GraphicsContext3D::DEPTH_FUNC: |
2479 return getUnsignedIntParameter(pname); | 2441 return getUnsignedIntParameter(pname); |
2480 case GraphicsContext3D::DEPTH_RANGE: | 2442 case GraphicsContext3D::DEPTH_RANGE: |
2481 return getWebGLFloatArrayParameter(pname); | 2443 return getWebGLFloatArrayParameter(pname); |
2482 case GraphicsContext3D::DEPTH_TEST: | 2444 case GraphicsContext3D::DEPTH_TEST: |
2483 return getBooleanParameter(pname); | 2445 return getBooleanParameter(pname); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2558 return getUnsignedIntParameter(pname); | 2520 return getUnsignedIntParameter(pname); |
2559 case GraphicsContext3D::STENCIL_BACK_PASS_DEPTH_PASS: | 2521 case GraphicsContext3D::STENCIL_BACK_PASS_DEPTH_PASS: |
2560 return getUnsignedIntParameter(pname); | 2522 return getUnsignedIntParameter(pname); |
2561 case GraphicsContext3D::STENCIL_BACK_REF: | 2523 case GraphicsContext3D::STENCIL_BACK_REF: |
2562 return getIntParameter(pname); | 2524 return getIntParameter(pname); |
2563 case GraphicsContext3D::STENCIL_BACK_VALUE_MASK: | 2525 case GraphicsContext3D::STENCIL_BACK_VALUE_MASK: |
2564 return getUnsignedIntParameter(pname); | 2526 return getUnsignedIntParameter(pname); |
2565 case GraphicsContext3D::STENCIL_BACK_WRITEMASK: | 2527 case GraphicsContext3D::STENCIL_BACK_WRITEMASK: |
2566 return getUnsignedIntParameter(pname); | 2528 return getUnsignedIntParameter(pname); |
2567 case GraphicsContext3D::STENCIL_BITS: | 2529 case GraphicsContext3D::STENCIL_BITS: |
2568 if (!m_attributes.stencil) | 2530 if (!m_framebufferBinding && !m_attributes.stencil) |
2569 return WebGLGetInfo(intZero); | 2531 return WebGLGetInfo(intZero); |
2570 return getIntParameter(pname); | 2532 return getIntParameter(pname); |
2571 case GraphicsContext3D::STENCIL_CLEAR_VALUE: | 2533 case GraphicsContext3D::STENCIL_CLEAR_VALUE: |
2572 return getIntParameter(pname); | 2534 return getIntParameter(pname); |
2573 case GraphicsContext3D::STENCIL_FAIL: | 2535 case GraphicsContext3D::STENCIL_FAIL: |
2574 return getUnsignedIntParameter(pname); | 2536 return getUnsignedIntParameter(pname); |
2575 case GraphicsContext3D::STENCIL_FUNC: | 2537 case GraphicsContext3D::STENCIL_FUNC: |
2576 return getUnsignedIntParameter(pname); | 2538 return getUnsignedIntParameter(pname); |
2577 case GraphicsContext3D::STENCIL_PASS_DEPTH_FAIL: | 2539 case GraphicsContext3D::STENCIL_PASS_DEPTH_FAIL: |
2578 return getUnsignedIntParameter(pname); | 2540 return getUnsignedIntParameter(pname); |
(...skipping 3015 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5594 { | 5556 { |
5595 if (enable) | 5557 if (enable) |
5596 m_context->enable(capability); | 5558 m_context->enable(capability); |
5597 else | 5559 else |
5598 m_context->disable(capability); | 5560 m_context->disable(capability); |
5599 } | 5561 } |
5600 | 5562 |
5601 } // namespace WebCore | 5563 } // namespace WebCore |
5602 | 5564 |
5603 #endif // ENABLE(WEBGL) | 5565 #endif // ENABLE(WEBGL) |
OLD | NEW |