bool WebGLCompressedTextureS3TC::supported(WebGLRenderingContextBase* context) { Extensions3DUtil* extensionsUtil = context->extensionsUtil(); return extensionsUtil->supportsExtension("GL_EXT_texture_compression_s3tc") || (extensionsUtil->supportsExtension("GL_EXT_texture_compression_dxt1") && extensionsUtil->supportsExtension("GL_CHROMIUM_texture_compression_dxt3") && extensionsUtil->supportsExtension("GL_CHROMIUM_texture_compression_dxt5")); }
bool WebGLDepthTexture::supported(WebGLRenderingContextBase* context) { Extensions3DUtil* extensionsUtil = context->extensionsUtil(); // Emulating the UNSIGNED_INT_24_8_WEBGL texture internal format in terms // of two separate texture objects is too difficult, so disable depth // textures unless a packed depth/stencil format is available. if (!extensionsUtil->supportsExtension("GL_OES_packed_depth_stencil")) return false; return extensionsUtil->supportsExtension("GL_CHROMIUM_depth_texture") || extensionsUtil->supportsExtension("GL_OES_depth_texture") || extensionsUtil->supportsExtension("GL_ARB_depth_texture"); }
bool WebGLCompressedTextureASTC::supported(WebGLRenderingContextBase* context) { Extensions3DUtil* extensionsUtil = context->extensionsUtil(); return extensionsUtil->supportsExtension("GL_KHR_texture_compression_astc_ldr"); }
bool WebGLCompressedTextureS3TCsRGB::supported( WebGLRenderingContextBase* context) { Extensions3DUtil* extensionsUtil = context->extensionsUtil(); return extensionsUtil->supportsExtension( "GL_EXT_texture_compression_s3tc_srgb"); }
bool WebGLCompressedTextureETC1::supported(WebGLRenderingContextBase* context) { Extensions3DUtil* extensionsUtil = context->extensionsUtil(); return extensionsUtil->supportsExtension("GL_OES_compressed_ETC1_RGB8_texture"); }
// static bool WebGLDrawBuffers::satisfiesWebGLRequirements(WebGLRenderingContextBase* webglContext) { WebGraphicsContext3D* context = webglContext->webContext(); Extensions3DUtil* extensionsUtil = webglContext->extensionsUtil(); // This is called after we make sure GL_EXT_draw_buffers is supported. GLint maxDrawBuffers = 0; GLint maxColorAttachments = 0; context->getIntegerv(GL_MAX_DRAW_BUFFERS_EXT, &maxDrawBuffers); context->getIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, &maxColorAttachments); if (maxDrawBuffers < 4 || maxColorAttachments < 4) return false; Platform3DObject fbo = context->createFramebuffer(); context->bindFramebuffer(GL_FRAMEBUFFER, fbo); const unsigned char* buffer = 0; // Chromium doesn't allow init data for depth/stencil tetxures. bool supportsDepth = (extensionsUtil->supportsExtension("GL_CHROMIUM_depth_texture") || extensionsUtil->supportsExtension("GL_OES_depth_texture") || extensionsUtil->supportsExtension("GL_ARB_depth_texture")); bool supportsDepthStencil = (extensionsUtil->supportsExtension("GL_EXT_packed_depth_stencil") || extensionsUtil->supportsExtension("GL_OES_packed_depth_stencil")); Platform3DObject depthStencil = 0; if (supportsDepthStencil) { depthStencil = context->createTexture(); context->bindTexture(GL_TEXTURE_2D, depthStencil); context->texImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_STENCIL_OES, 1, 1, 0, GL_DEPTH_STENCIL_OES, GL_UNSIGNED_INT_24_8_OES, buffer); } Platform3DObject depth = 0; if (supportsDepth) { depth = context->createTexture(); context->bindTexture(GL_TEXTURE_2D, depth); context->texImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 1, 1, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, buffer); } Vector<Platform3DObject> colors; bool ok = true; GLint maxAllowedBuffers = std::min(maxDrawBuffers, maxColorAttachments); for (GLint i = 0; i < maxAllowedBuffers; ++i) { Platform3DObject color = context->createTexture(); colors.append(color); context->bindTexture(GL_TEXTURE_2D, color); context->texImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer); context->framebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, color, 0); if (context->checkFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { ok = false; break; } if (supportsDepth) { context->framebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth, 0); if (context->checkFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { ok = false; break; } context->framebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, 0, 0); } if (supportsDepthStencil) { context->framebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthStencil, 0); context->framebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, depthStencil, 0); if (context->checkFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { ok = false; break; } context->framebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, 0, 0); context->framebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0); } } webglContext->restoreCurrentFramebuffer(); context->deleteFramebuffer(fbo); webglContext->restoreCurrentTexture2D(); if (supportsDepth) context->deleteTexture(depth); if (supportsDepthStencil) context->deleteTexture(depthStencil); for (size_t i = 0; i < colors.size(); ++i) context->deleteTexture(colors[i]); return ok; }
// static bool WebGLDrawBuffers::satisfiesWebGLRequirements(WebGLRenderingContextBase* webglContext) { gpu::gles2::GLES2Interface* gl = webglContext->contextGL(); Extensions3DUtil* extensionsUtil = webglContext->extensionsUtil(); // This is called after we make sure GL_EXT_draw_buffers is supported. GLint maxDrawBuffers = 0; GLint maxColorAttachments = 0; gl->GetIntegerv(GL_MAX_DRAW_BUFFERS_EXT, &maxDrawBuffers); gl->GetIntegerv(GL_MAX_COLOR_ATTACHMENTS_EXT, &maxColorAttachments); if (maxDrawBuffers < 4 || maxColorAttachments < 4) return false; GLuint fbo; gl->GenFramebuffers(1, &fbo); gl->BindFramebuffer(GL_FRAMEBUFFER, fbo); const unsigned char* buffer = 0; // Chromium doesn't allow init data for depth/stencil tetxures. bool supportsDepth = (extensionsUtil->supportsExtension("GL_CHROMIUM_depth_texture") || extensionsUtil->supportsExtension("GL_OES_depth_texture") || extensionsUtil->supportsExtension("GL_ARB_depth_texture")); bool supportsDepthStencil = (extensionsUtil->supportsExtension("GL_EXT_packed_depth_stencil") || extensionsUtil->supportsExtension("GL_OES_packed_depth_stencil")); GLuint depthStencil = 0; if (supportsDepthStencil) { gl->GenTextures(1, &depthStencil); gl->BindTexture(GL_TEXTURE_2D, depthStencil); gl->TexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_STENCIL_OES, 1, 1, 0, GL_DEPTH_STENCIL_OES, GL_UNSIGNED_INT_24_8_OES, buffer); } GLuint depth = 0; if (supportsDepth) { gl->GenTextures(1, &depth); gl->BindTexture(GL_TEXTURE_2D, depth); gl->TexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 1, 1, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, buffer); } Vector<GLuint> colors; bool ok = true; GLint maxAllowedBuffers = std::min(maxDrawBuffers, maxColorAttachments); for (GLint i = 0; i < maxAllowedBuffers; ++i) { GLuint color; gl->GenTextures(1, &color); colors.append(color); gl->BindTexture(GL_TEXTURE_2D, color); gl->TexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1, 1, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer); gl->FramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i, GL_TEXTURE_2D, color, 0); if (gl->CheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { ok = false; break; } if (supportsDepth) { gl->FramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth, 0); if (gl->CheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { ok = false; break; } gl->FramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, 0, 0); } if (supportsDepthStencil) { // For ES 2.0 contexts DEPTH_STENCIL is not available natively, so we emulate it // at the command buffer level for WebGL contexts. gl->FramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, depthStencil, 0); if (gl->CheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) { ok = false; break; } gl->FramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, 0, 0); } } webglContext->restoreCurrentFramebuffer(); gl->DeleteFramebuffers(1, &fbo); webglContext->restoreCurrentTexture2D(); if (supportsDepth) gl->DeleteTextures(1, &depth); if (supportsDepthStencil) gl->DeleteTextures(1, &depthStencil); gl->DeleteTextures(colors.size(), colors.data()); return ok; }