Edit

kc3-lang/angle/src/tests/test_utils/gl_raii.h

Branch :

  • Show log

    Commit

  • Author : Jamie Madill
    Date : 2017-03-15 18:09:26
    Hash : 8aeeed6e
    Message : D3D11: Work around compiler nested sampling bug. We can potentially work around a bug in the HLSL compiler by omitting the const qualifier from some sampling operations. BUG=angleproject:1923 Change-Id: I8a5d119707721e9c19f06be4ad808f87bfcdbee5 Reviewed-on: https://chromium-review.googlesource.com/454938 Reviewed-by: Corentin Wallez <cwallez@chromium.org> Reviewed-by: Jamie Madill <jmadill@chromium.org> Commit-Queue: Jamie Madill <jmadill@chromium.org>

  • src/tests/test_utils/gl_raii.h
  • //
    // Copyright (c) 2016 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.
    //
    // gl_raii:
    //   Helper methods for containing GL objects like buffers and textures.
    
    #ifndef ANGLE_TESTS_GL_RAII_H_
    #define ANGLE_TESTS_GL_RAII_H_
    
    #include <functional>
    
    #include "angle_gl.h"
    
    namespace angle
    {
    
    // This is a bit of hack to work around a bug in MSVS intellisense, and make it very easy to
    // use the correct function pointer type without worrying about the various definitions of
    // GL_APICALL.
    using GLGen    = decltype(glGenBuffers);
    using GLDelete = decltype(glDeleteBuffers);
    
    template <GLGen GenF, GLDelete DeleteF>
    class GLWrapper
    {
      public:
        GLWrapper() {}
        ~GLWrapper() { DeleteF(1, &mHandle); }
    
        GLuint get()
        {
            if (!mHandle)
            {
                GenF(1, &mHandle);
            }
            return mHandle;
        }
    
        operator GLuint() { return get(); }
    
      private:
        GLuint mHandle = 0;
    };
    
    using GLBuffer       = GLWrapper<glGenBuffers, glDeleteBuffers>;
    using GLTexture      = GLWrapper<glGenTextures, glDeleteTextures>;
    using GLFramebuffer  = GLWrapper<glGenFramebuffers, glDeleteFramebuffers>;
    using GLRenderbuffer = GLWrapper<glGenRenderbuffers, glDeleteRenderbuffers>;
    using GLSampler      = GLWrapper<glGenSamplers, glDeleteSamplers>;
    
    // Don't use GLProgram directly, use ANGLE_GL_PROGRAM.
    namespace priv
    {
    class GLProgram
    {
      public:
        GLProgram() : mHandle(0) {}
    
        ~GLProgram() { glDeleteProgram(mHandle); }
    
        void makeCompute(const std::string &computeShader)
        {
            mHandle = CompileComputeProgram(computeShader);
        }
    
        void makeRaster(const std::string &vertexShader, const std::string &fragmentShader)
        {
            mHandle = CompileProgram(vertexShader, fragmentShader);
        }
    
        void makeBinaryOES(const std::vector<uint8_t> &binary, GLenum binaryFormat)
        {
            mHandle = LoadBinaryProgramOES(binary, binaryFormat);
        }
    
        void makeBinaryES3(const std::vector<uint8_t> &binary, GLenum binaryFormat)
        {
            mHandle = LoadBinaryProgramES3(binary, binaryFormat);
        }
    
        bool valid() const { return mHandle != 0; }
    
        GLuint get()
        {
            ASSERT(valid());
            return mHandle;
        }
    
        operator GLuint() { return get(); }
    
      private:
        GLuint mHandle;
    };
    }  // namespace priv
    
    #define ANGLE_GL_PROGRAM(name, vertex, fragment) \
        priv::GLProgram name;                        \
        name.makeRaster(vertex, fragment);           \
        ASSERT_TRUE(name.valid());
    
    #define ANGLE_GL_COMPUTE_PROGRAM(name, compute) \
        priv::GLProgram name;                       \
        name.makeCompute(compute);                  \
        ASSERT_TRUE(name.valid());
    
    #define ANGLE_GL_BINARY_OES_PROGRAM(name, binary, binaryFormat) \
        priv::GLProgram name;                                       \
        name.makeBinaryOES(binary, binaryFormat);                   \
        ASSERT_TRUE(name.valid());
    
    #define ANGLE_GL_BINARY_ES3_PROGRAM(name, binary, binaryFormat) \
        priv::GLProgram name;                                       \
        name.makeBinaryES3(binary, binaryFormat);                   \
        ASSERT_TRUE(name.valid());
    
    }  // namespace angle
    
    #endif  // ANGLE_TESTS_GL_RAII_H_