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