// // Copyright (c) 2014 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. // // ProgramD3D.cpp: Defines the rx::ProgramD3D class which implements rx::ProgramImpl. #include "libGLESv2/renderer/d3d/ProgramD3D.h" #include "common/utilities.h" #include "libGLESv2/ProgramBinary.h" #include "libGLESv2/renderer/Renderer.h" #include "libGLESv2/renderer/ShaderExecutable.h" #include "libGLESv2/renderer/d3d/DynamicHLSL.h" #include "libGLESv2/main.h" namespace rx { ProgramD3D::ProgramD3D(rx::Renderer *renderer) : ProgramImpl(), mRenderer(renderer), mDynamicHLSL(NULL), mVertexUniformStorage(NULL), mFragmentUniformStorage(NULL) { mDynamicHLSL = new rx::DynamicHLSL(renderer); } ProgramD3D::~ProgramD3D() { reset(); SafeDelete(mDynamicHLSL); } ProgramD3D *ProgramD3D::makeProgramD3D(ProgramImpl *impl) { ASSERT(HAS_DYNAMIC_TYPE(ProgramD3D*, impl)); return static_cast(impl); } const ProgramD3D *ProgramD3D::makeProgramD3D(const ProgramImpl *impl) { ASSERT(HAS_DYNAMIC_TYPE(const ProgramD3D*, impl)); return static_cast(impl); } void ProgramD3D::initializeUniformStorage(const std::vector &uniforms) { // Compute total default block size unsigned int vertexRegisters = 0; unsigned int fragmentRegisters = 0; for (size_t uniformIndex = 0; uniformIndex < uniforms.size(); uniformIndex++) { const gl::LinkedUniform &uniform = *uniforms[uniformIndex]; if (!gl::IsSampler(uniform.type)) { if (uniform.isReferencedByVertexShader()) { vertexRegisters = std::max(vertexRegisters, uniform.vsRegisterIndex + uniform.registerCount); } if (uniform.isReferencedByFragmentShader()) { fragmentRegisters = std::max(fragmentRegisters, uniform.psRegisterIndex + uniform.registerCount); } } } mVertexUniformStorage = mRenderer->createUniformStorage(vertexRegisters * 16u); mFragmentUniformStorage = mRenderer->createUniformStorage(fragmentRegisters * 16u); } void ProgramD3D::reset() { SafeDelete(mVertexUniformStorage); SafeDelete(mFragmentUniformStorage); } }