17e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.org//
27e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.org// Copyright (c) 2010-2013 The ANGLE Project Authors. All rights reserved.
37e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.org// Use of this source code is governed by a BSD-style license that can be
47e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.org// found in the LICENSE file.
57e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.org//
67e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.org
77e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.org#include "libGLESv2/Uniform.h"
87e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.org
9a2ecfcccf1d1a85e6054a7314ce1f9de0648ac7fshannonwoods@chromium.org#include "common/utilities.h"
107e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.org
117e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.orgnamespace gl
127e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.org{
137e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.org
14834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie MadillLinkedUniform::LinkedUniform(GLenum type, GLenum precision, const std::string &name, unsigned int arraySize,
15f257598999faf907a50d8a9f9eff28dad0ff2628Jamie Madill                             const int blockIndex, const sh::BlockMemberInfo &blockInfo)
16d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org    : type(type),
17d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org      precision(precision),
18d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org      name(name),
19d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org      arraySize(arraySize),
20d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org      blockIndex(blockIndex),
21d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org      blockInfo(blockInfo),
22d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org      data(NULL),
23d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org      dirty(true),
24d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org      psRegisterIndex(GL_INVALID_INDEX),
25d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org      vsRegisterIndex(GL_INVALID_INDEX),
265b085dc344f1c7a54aa164c0db8eb7c9675f8c66Jamie Madill      registerCount(0),
275b085dc344f1c7a54aa164c0db8eb7c9675f8c66Jamie Madill      registerElement(0)
287e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.org{
29d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org    // We use data storage for default block uniforms to cache values that are sent to D3D during rendering
30d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org    // Uniform blocks/buffers are treated separately by the Renderer (ES3 path only)
31d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org    if (isInDefaultBlock())
32d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org    {
335b085dc344f1c7a54aa164c0db8eb7c9675f8c66Jamie Madill        size_t bytes = dataSize();
34d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org        data = new unsigned char[bytes];
35d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org        memset(data, 0, bytes);
36d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org        registerCount = VariableRowCount(type) * elementCount();
37d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org    }
387e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.org}
397e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.org
40834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie MadillLinkedUniform::~LinkedUniform()
417e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.org{
427e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.org    delete[] data;
437e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.org}
447e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.org
45834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madillbool LinkedUniform::isArray() const
467e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.org{
477e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.org    return arraySize > 0;
487e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.org}
497e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.org
50834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madillunsigned int LinkedUniform::elementCount() const
517e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.org{
527e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.org    return arraySize > 0 ? arraySize : 1;
537e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.org}
547e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.org
55834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madillbool LinkedUniform::isReferencedByVertexShader() const
5638676dc14bd6136e9607e05825890ecf5cb402f1shannonwoods@chromium.org{
5738676dc14bd6136e9607e05825890ecf5cb402f1shannonwoods@chromium.org    return vsRegisterIndex != GL_INVALID_INDEX;
5838676dc14bd6136e9607e05825890ecf5cb402f1shannonwoods@chromium.org}
5938676dc14bd6136e9607e05825890ecf5cb402f1shannonwoods@chromium.org
60834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madillbool LinkedUniform::isReferencedByFragmentShader() const
6138676dc14bd6136e9607e05825890ecf5cb402f1shannonwoods@chromium.org{
6238676dc14bd6136e9607e05825890ecf5cb402f1shannonwoods@chromium.org    return psRegisterIndex != GL_INVALID_INDEX;
6338676dc14bd6136e9607e05825890ecf5cb402f1shannonwoods@chromium.org}
6438676dc14bd6136e9607e05825890ecf5cb402f1shannonwoods@chromium.org
65834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madillbool LinkedUniform::isInDefaultBlock() const
66d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org{
67d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org    return blockIndex == -1;
68d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org}
69d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org
70834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madillsize_t LinkedUniform::dataSize() const
715b085dc344f1c7a54aa164c0db8eb7c9675f8c66Jamie Madill{
72fcef3366e821db7ba7244a6a6829364b48527715Jamie Madill    ASSERT(type != GL_STRUCT_ANGLEX);
73f257598999faf907a50d8a9f9eff28dad0ff2628Jamie Madill    return VariableInternalSize(type) * elementCount();
745b085dc344f1c7a54aa164c0db8eb7c9675f8c66Jamie Madill}
755b085dc344f1c7a54aa164c0db8eb7c9675f8c66Jamie Madill
76834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madillbool LinkedUniform::isSampler() const
778ff21aeaabebd0877c1cc48fdac718509f23617aJamie Madill{
78834e8b7715c25e299c07c9d63f5be0a0ee6c5856Jamie Madill    return IsSampler(type);
798ff21aeaabebd0877c1cc48fdac718509f23617aJamie Madill}
808ff21aeaabebd0877c1cc48fdac718509f23617aJamie Madill
81d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.orgUniformBlock::UniformBlock(const std::string &name, unsigned int elementIndex, unsigned int dataSize)
82d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org    : name(name),
83d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org      elementIndex(elementIndex),
84d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org      dataSize(dataSize),
85d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org      psRegisterIndex(GL_INVALID_INDEX),
86d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org      vsRegisterIndex(GL_INVALID_INDEX)
87d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org{
88d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org}
89d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org
90d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.orgbool UniformBlock::isArrayElement() const
91d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org{
92d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org    return elementIndex != GL_INVALID_INDEX;
93d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org}
94d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org
95d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.orgbool UniformBlock::isReferencedByVertexShader() const
96d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org{
97d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org    return vsRegisterIndex != GL_INVALID_INDEX;
98d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org}
99d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org
100d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.orgbool UniformBlock::isReferencedByFragmentShader() const
101d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org{
102d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org    return psRegisterIndex != GL_INVALID_INDEX;
103d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org}
104d77841743376350e4e483a955cd94cf77d8bca63shannonwoods@chromium.org
1057e0904d3255fe2bc034e226cdf4761bf2f02c813shannonwoods@chromium.org}
106