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 22 matching lines...) Expand all Loading... |
33 { | 33 { |
34 return new WebGLTexture(ctx); | 34 return new WebGLTexture(ctx); |
35 } | 35 } |
36 | 36 |
37 WebGLTexture::WebGLTexture(WebGLRenderingContextBase* ctx) | 37 WebGLTexture::WebGLTexture(WebGLRenderingContextBase* ctx) |
38 : WebGLSharedPlatform3DObject(ctx) | 38 : WebGLSharedPlatform3DObject(ctx) |
39 , m_target(0) | 39 , m_target(0) |
40 , m_isNPOT(false) | 40 , m_isNPOT(false) |
41 , m_isCubeComplete(false) | 41 , m_isCubeComplete(false) |
42 , m_isComplete(false) | 42 , m_isComplete(false) |
43 , m_needToUseBlackTexture(false) | |
44 , m_isFloatType(false) | 43 , m_isFloatType(false) |
45 , m_isHalfFloatType(false) | 44 , m_isHalfFloatType(false) |
46 , m_isWebGL2OrHigher(ctx->isWebGL2OrHigher()) | 45 , m_isWebGL2OrHigher(ctx->isWebGL2OrHigher()) |
47 , m_immutable(false) | 46 , m_immutable(false) |
48 , m_baseLevel(0) | 47 , m_baseLevel(0) |
49 , m_maxLevel(1000) | 48 , m_maxLevel(1000) |
50 { | 49 { |
51 setObject(ctx->webContext()->createTexture()); | 50 setObject(ctx->webContext()->createTexture()); |
52 } | 51 } |
53 | 52 |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
221 for (size_t level = m_baseLevel + 1; level <= maxLevel; ++level) { | 220 for (size_t level = m_baseLevel + 1; level <= maxLevel; ++level) { |
222 width = std::max(1, width >> 1); | 221 width = std::max(1, width >> 1); |
223 height = std::max(1, height >> 1); | 222 height = std::max(1, height >> 1); |
224 depth = std::max(1, depth >> 1); | 223 depth = std::max(1, depth >> 1); |
225 LevelInfo& info = m_info[ii][level]; | 224 LevelInfo& info = m_info[ii][level]; |
226 info.setInfo(info0.internalFormat, width, height, depth, info0.t
ype); | 225 info.setInfo(info0.internalFormat, width, height, depth, info0.t
ype); |
227 } | 226 } |
228 } | 227 } |
229 m_isComplete = true; | 228 m_isComplete = true; |
230 } | 229 } |
231 m_needToUseBlackTexture = false; | |
232 } | 230 } |
233 | 231 |
234 GLenum WebGLTexture::getInternalFormat(GLenum target, GLint level) const | 232 GLenum WebGLTexture::getInternalFormat(GLenum target, GLint level) const |
235 { | 233 { |
236 const LevelInfo* info = getLevelInfo(target, level); | 234 const LevelInfo* info = getLevelInfo(target, level); |
237 if (!info) | 235 if (!info) |
238 return 0; | 236 return 0; |
239 return info->internalFormat; | 237 return info->internalFormat; |
240 } | 238 } |
241 | 239 |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
294 if (!object()) | 292 if (!object()) |
295 return false; | 293 return false; |
296 return m_isNPOT; | 294 return m_isNPOT; |
297 } | 295 } |
298 | 296 |
299 bool WebGLTexture::needToUseBlackTexture(TextureExtensionFlag flag, const WebGLS
amplerState* samplerState) const | 297 bool WebGLTexture::needToUseBlackTexture(TextureExtensionFlag flag, const WebGLS
amplerState* samplerState) const |
300 { | 298 { |
301 ASSERT(samplerState); | 299 ASSERT(samplerState); |
302 if (!object()) | 300 if (!object()) |
303 return false; | 301 return false; |
304 if (m_needToUseBlackTexture) | |
305 return true; | |
306 if ((m_isFloatType && !(flag & TextureFloatLinearExtensionEnabled)) || (m_is
HalfFloatType && !(flag && TextureHalfFloatLinearExtensionEnabled))) { | 302 if ((m_isFloatType && !(flag & TextureFloatLinearExtensionEnabled)) || (m_is
HalfFloatType && !(flag && TextureHalfFloatLinearExtensionEnabled))) { |
307 if (samplerState->magFilter != GL_NEAREST || (samplerState->minFilter !=
GL_NEAREST && samplerState->minFilter != GL_NEAREST_MIPMAP_NEAREST)) | 303 if (samplerState->magFilter != GL_NEAREST || (samplerState->minFilter !=
GL_NEAREST && samplerState->minFilter != GL_NEAREST_MIPMAP_NEAREST)) |
308 return true; | 304 return true; |
309 } | 305 } |
310 return false; | 306 return false; |
311 } | 307 } |
312 | 308 |
313 void WebGLTexture::deleteObjectImpl(WebGraphicsContext3D* context3d) | 309 void WebGLTexture::deleteObjectImpl(WebGraphicsContext3D* context3d) |
314 { | 310 { |
315 context3d->deleteTexture(m_object); | 311 context3d->deleteTexture(m_object); |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
430 || info.internalFormat != info0.internalFormat || info.type
!= info0.type) { | 426 || info.internalFormat != info0.internalFormat || info.type
!= info0.type) { |
431 m_isComplete = false; | 427 m_isComplete = false; |
432 break; | 428 break; |
433 } | 429 } |
434 | 430 |
435 } | 431 } |
436 } | 432 } |
437 } | 433 } |
438 m_isFloatType = m_info[0][0].type == GL_FLOAT; | 434 m_isFloatType = m_info[0][0].type == GL_FLOAT; |
439 m_isHalfFloatType = m_info[0][0].type == GL_HALF_FLOAT_OES; | 435 m_isHalfFloatType = m_info[0][0].type == GL_HALF_FLOAT_OES; |
440 | |
441 m_needToUseBlackTexture = false; | |
442 // If it is a Cube texture, check Cube Completeness first | |
443 if (m_info.size() > 1 && !m_isCubeComplete) | |
444 m_needToUseBlackTexture = true; | |
445 if (!m_isWebGL2OrHigher) { | |
446 // We can do these checks up front in WebGL 1 because there's no separat
e samplers. | |
447 // NPOT | |
448 if (m_isNPOT && ((m_samplerState.minFilter != GL_NEAREST && m_samplerSta
te.minFilter != GL_LINEAR) | |
449 || m_samplerState.wrapS != GL_CLAMP_TO_EDGE || m_samplerState.wrapT
!= GL_CLAMP_TO_EDGE)) | |
450 m_needToUseBlackTexture = true; | |
451 // Completeness | |
452 if (!m_isComplete && m_samplerState.minFilter != GL_NEAREST && m_sampler
State.minFilter != GL_LINEAR) | |
453 m_needToUseBlackTexture = true; | |
454 } | |
455 } | 436 } |
456 | 437 |
457 const WebGLTexture::LevelInfo* WebGLTexture::getLevelInfo(GLenum target, GLint l
evel) const | 438 const WebGLTexture::LevelInfo* WebGLTexture::getLevelInfo(GLenum target, GLint l
evel) const |
458 { | 439 { |
459 if (!object() || !m_target) | 440 if (!object() || !m_target) |
460 return nullptr; | 441 return nullptr; |
461 int targetIndex = mapTargetToIndex(target); | 442 int targetIndex = mapTargetToIndex(target); |
462 if (targetIndex < 0 || targetIndex >= static_cast<int>(m_info.size())) | 443 if (targetIndex < 0 || targetIndex >= static_cast<int>(m_info.size())) |
463 return nullptr; | 444 return nullptr; |
464 if (level < 0 || level >= static_cast<GLint>(m_info[targetIndex].size())) | 445 if (level < 0 || level >= static_cast<GLint>(m_info[targetIndex].size())) |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
591 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: | 572 case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: |
592 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: | 573 case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: |
593 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: | 574 case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: |
594 return GL_UNSIGNED_BYTE; | 575 return GL_UNSIGNED_BYTE; |
595 default: | 576 default: |
596 return GL_NONE; | 577 return GL_NONE; |
597 } | 578 } |
598 } | 579 } |
599 | 580 |
600 } // namespace blink | 581 } // namespace blink |
OLD | NEW |