Hash :
17b3c2f3
        
        Author :
  
        
        Date :
2019-10-14T14:13:59
        
      
Implement SamplerVideoWEBGL for WEBGL_video_texture extension on desktop WEBGL_video_texture is an extension that will improve uploading video frame to WebGL performance. (https://www.khronos.org/registry/webgl/extensions/proposals/WEBGL_video_texture/) This extension introduced a new texture type TEXTURE_VIDEO_IMAGE_WEBGL and a new sampler type samplerVideoWEBGL to sample it. In chromium implementation, TEXTURE_VIDEO_IMAGE_WEBGL maps to different native texture type based on platform. On desktop, it maps to GL_TEXTURE2D(Currently supported). On Android, it should map to GL_TEXTURE_EXTERNAL(TODO). SamplerVideoWEBGL needs to be mapped to sampler2D or samplerExternalOES according to TEXTURE_VIDEO_IMAGE_WEBGL implementation. This patch implements samplerVideoWEBGL in Angle to support WEBGL_video_texture on desktop. In this case, samplerVideoWEBGL should map to sampler2D. Bug: chromium:776222, angleproject:3889 Change-Id: Idb0a5fcde37ca75ccc1181226b91f257212e7500 Reviewed-on: https://chromium-review.googlesource.com/c/angle/angle/+/1866274 Commit-Queue: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Shahbaz Youssefi <syoussefi@chromium.org> Reviewed-by: Geoff Lang <geofflang@chromium.org>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
//
// Copyright 2019 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// samplerVideoWEBGL_test.cpp:
// Tests compiling shaders that use samplerVideoWEBGL types
//
#include "GLSLANG/ShaderLang.h"
#include "angle_gl.h"
#include "gtest/gtest.h"
#include "tests/test_utils/ShaderCompileTreeTest.h"
using namespace sh;
class SamplerVideoWEBGLTest : public ShaderCompileTreeTest
{
  public:
    SamplerVideoWEBGLTest() {}
    void initResources(ShBuiltInResources *resources) override
    {
        resources->WEBGL_video_texture = 1;
    }
  protected:
    ::GLenum getShaderType() const override { return GL_FRAGMENT_SHADER; }
    ShShaderSpec getShaderSpec() const override { return SH_GLES3_1_SPEC; }
};
// Checks whether compiler returns error when extension isn't enabled but samplerVideoWEBGL is
// used in shader.
TEST_F(SamplerVideoWEBGLTest, UsingSamplerVideoWEBGLWithoutWEBGLVideoTextureExtensionRequired)
{
    const std::string &shaderString =
        "precision mediump float;\n"
        "uniform mediump samplerVideoWEBGL s;\n"
        "void main()\n"
        "{\n"
        "    gl_FragColor = textureVideoWEBGL(s, vec2(0.0, 0.0));\n"
        "}\n";
    if (compile(shaderString))
    {
        FAIL() << "Shader compilation passed, expecting fail:\n" << mInfoLog;
    }
}
// Checks whether compiler returns error when extension isn't enabled but use samplerVideoWEBGL is
// used in ES300 shader.
TEST_F(SamplerVideoWEBGLTest,
       UsingSamplerVideoWEBGLWithoutWEBGLVideoTextureExtensionRequiredInES300)
{
    const std::string &shaderString =
        "#version 300 es"
        "precision mediump float;\n"
        "uniform mediump samplerVideoWEBGL s;\n"
        "out vec4 my_FragColor;\n"
        "void main()\n"
        "{\n"
        "   my_FragColor = texture(s, vec2(0.0, 0.0));\n"
        "}\n";
    if (compile(shaderString))
    {
        FAIL() << "Shader compilation passed, expecting fail:\n" << mInfoLog;
    }
}
// Checks whether compiler can support samplerVideoWEBGL as texture2D parameter.
TEST_F(SamplerVideoWEBGLTest, SamplerVideoWEBGLCanBeSupportedInTexture2D)
{
    const std::string &shaderString =
        "#extension GL_WEBGL_video_texture : require\n"
        "precision mediump float;\n"
        "uniform mediump samplerVideoWEBGL s;\n"
        "void main()\n"
        "{\n"
        "    gl_FragColor = textureVideoWEBGL(s, vec2(0.0, 0.0));\n"
        "}\n";
    if (!compile(shaderString))
    {
        FAIL() << "Shader compilation failed, expecting success:\n" << mInfoLog;
    }
}
// Checks whether compiler can support samplerVideoWEBGL as texture parameter in ES300.
TEST_F(SamplerVideoWEBGLTest, SamplerVideoWEBGLCanBeSupportedInTextureInES300)
{
    const std::string &shaderString =
        "#version 300 es\n"
        "#extension GL_WEBGL_video_texture : require\n"
        "precision mediump float;\n"
        "uniform mediump samplerVideoWEBGL s;\n"
        "out vec4 my_FragColor;\n"
        "void main()\n"
        "{\n"
        "    my_FragColor = texture(s, vec2(0.0, 0.0));\n"
        "}\n";
    if (!compile(shaderString))
    {
        FAIL() << "Shader compilation failed, expecting success:\n" << mInfoLog;
    }
}