15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2012 Adobe Systems Incorporated. All rights reserved.
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    copyright notice, this list of conditions and the following
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    disclaimer.
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    copyright notice, this list of conditions and the following
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    disclaimer in the documentation and/or other materials
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *    provided with the distribution.
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SUCH DAMAGE.
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
31a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/filters/custom/CustomFilterGlobalContext.h"
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
33a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/GraphicsContext3D.h"
34a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/graphics/filters/custom/CustomFilterValidatedProgram.h"
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CustomFilterGlobalContext::CustomFilterGlobalContext()
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)CustomFilterGlobalContext::~CustomFilterGlobalContext()
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (CustomFilterValidatedProgramsMap::iterator iter = m_programs.begin(); iter != m_programs.end(); ++iter)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        iter->value->detachFromGlobalContext();
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
481e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)ANGLEPlatformBridge* CustomFilterGlobalContext::webglShaderValidator()
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_webglShaderValidator)
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_webglShaderValidator = createShaderValidator(SH_WEBGL_SPEC);
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_webglShaderValidator.get();
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
551e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)ANGLEPlatformBridge* CustomFilterGlobalContext::mixShaderValidator()
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_mixShaderValidator)
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_mixShaderValidator = createShaderValidator(SH_CSS_SHADERS_SPEC);
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_mixShaderValidator.get();
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
621e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)PassOwnPtr<ANGLEPlatformBridge> CustomFilterGlobalContext::createShaderValidator(ShShaderSpec shaderSpec)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
641e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    OwnPtr<ANGLEPlatformBridge> validator = adoptPtr(new ANGLEPlatformBridge(SH_ESSL_OUTPUT, shaderSpec));
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ShBuiltInResources resources;
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ShInitBuiltInResources(&resources);
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    validator->setResources(resources);
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return validator.release();
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)void CustomFilterGlobalContext::prepareContextIfNeeded()
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (m_context.get())
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    GraphicsContext3D::Attributes attributes;
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    attributes.preserveDrawingBuffer = true;
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    attributes.premultipliedAlpha = false;
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    attributes.shareResources = true;
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    attributes.preferDiscreteGPU = true;
8181a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)    m_context = GraphicsContext3D::create(attributes);
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!m_context)
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_context->makeContextCurrent();
85e08f70592b3fc0d5e68b9b914c9196e813720070Torne (Richard Coles)    m_context->enable(GL_DEPTH_TEST);
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<CustomFilterValidatedProgram> CustomFilterGlobalContext::getValidatedProgram(const CustomFilterProgramInfo& programInfo)
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CustomFilterValidatedProgramsMap::iterator iter = m_programs.find(programInfo);
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (iter != m_programs.end())
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return iter->value;
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    RefPtr<CustomFilterValidatedProgram> validatedProgram = CustomFilterValidatedProgram::create(this, programInfo);
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_programs.set(programInfo, validatedProgram.get());
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return validatedProgram.release();
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CustomFilterGlobalContext::removeValidatedProgram(const CustomFilterValidatedProgram* program)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CustomFilterValidatedProgramsMap::iterator iter = m_programs.find(program->programInfo());
10251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    ASSERT_WITH_SECURITY_IMPLICATION(iter != m_programs.end());
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_programs.remove(iter);
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef NDEBUG
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Check that there's no way we could have the same program under a different key.
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    for (iter = m_programs.begin(); iter != m_programs.end(); ++iter)
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT(iter->value != program);
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
113