Edit

kc3-lang/angle/src/libANGLE/Uniform.cpp

Branch :

  • Show log

    Commit

  • Author : Jamie Madill
    Date : 2015-09-02 20:40:51
    Hash : 48705cad
    Message : Revert "Move Uniform and UBO info to the gl::Program layer." Seems to be failing dEQP-GLES2.functional.uniform_api.value.unused_uniforms.* on Linux (possibly Win as well) BUG=angleproject:1123 This reverts commit 54f882c9167b1aff5b3700187a2048bd886e8b17. Change-Id: I7dbbf40aae8dd9ebd35895df0dd338a3b6b9cc96 Reviewed-on: https://chromium-review.googlesource.com/297051 Reviewed-by: Jamie Madill <jmadill@chromium.org> Tested-by: Jamie Madill <jmadill@chromium.org>

  • src/libANGLE/Uniform.cpp
  • //
    // Copyright (c) 2010-2013 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.
    //
    
    #include "libANGLE/Uniform.h"
    
    #include "common/utilities.h"
    
    #include <cstring>
    
    namespace gl
    {
    
    LinkedUniform::LinkedUniform(GLenum type, GLenum precision, const std::string &name, unsigned int arraySize,
                                 const int blockIndex, const sh::BlockMemberInfo &blockInfo)
        : type(type),
          precision(precision),
          name(name),
          arraySize(arraySize),
          blockIndex(blockIndex),
          blockInfo(blockInfo),
          data(NULL),
          dirty(true),
          psRegisterIndex(GL_INVALID_INDEX),
          vsRegisterIndex(GL_INVALID_INDEX),
          registerCount(0),
          registerElement(0)
    {
        // We use data storage for default block uniforms to cache values that are sent to D3D during rendering
        // Uniform blocks/buffers are treated separately by the Renderer (ES3 path only)
        if (isInDefaultBlock())
        {
            size_t bytes = dataSize();
            data = new unsigned char[bytes];
            memset(data, 0, bytes);
            registerCount = VariableRowCount(type) * elementCount();
        }
    }
    
    LinkedUniform::~LinkedUniform()
    {
        delete[] data;
    }
    
    bool LinkedUniform::isArray() const
    {
        return arraySize > 0;
    }
    
    unsigned int LinkedUniform::elementCount() const
    {
        return arraySize > 0 ? arraySize : 1;
    }
    
    bool LinkedUniform::isReferencedByVertexShader() const
    {
        return vsRegisterIndex != GL_INVALID_INDEX;
    }
    
    bool LinkedUniform::isReferencedByFragmentShader() const
    {
        return psRegisterIndex != GL_INVALID_INDEX;
    }
    
    bool LinkedUniform::isInDefaultBlock() const
    {
        return blockIndex == -1;
    }
    
    size_t LinkedUniform::dataSize() const
    {
        ASSERT(type != GL_STRUCT_ANGLEX);
        return VariableInternalSize(type) * elementCount();
    }
    
    bool LinkedUniform::isSampler() const
    {
        return IsSamplerType(type);
    }
    
    bool LinkedUniform::isBuiltIn() const
    {
        return name.compare(0, 3, "gl_") == 0;
    }
    
    UniformBlock::UniformBlock(const std::string &name, unsigned int elementIndex, unsigned int dataSize)
        : name(name),
          elementIndex(elementIndex),
          dataSize(dataSize),
          psRegisterIndex(GL_INVALID_INDEX),
          vsRegisterIndex(GL_INVALID_INDEX)
    {
    }
    
    bool UniformBlock::isArrayElement() const
    {
        return elementIndex != GL_INVALID_INDEX;
    }
    
    bool UniformBlock::isReferencedByVertexShader() const
    {
        return vsRegisterIndex != GL_INVALID_INDEX;
    }
    
    bool UniformBlock::isReferencedByFragmentShader() const
    {
        return psRegisterIndex != GL_INVALID_INDEX;
    }
    
    }