diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libGLESv2.gypi | 3 | ||||
-rw-r--r-- | src/libGLESv2/Program.cpp | 6 | ||||
-rw-r--r-- | src/libGLESv2/ProgramBinary.cpp | 138 | ||||
-rw-r--r-- | src/libGLESv2/ProgramBinary.h | 14 | ||||
-rw-r--r-- | src/libGLESv2/renderer/ProgramImpl.h | 37 | ||||
-rw-r--r-- | src/libGLESv2/renderer/Renderer.h | 2 | ||||
-rw-r--r-- | src/libGLESv2/renderer/d3d/ProgramD3D.cpp | 81 | ||||
-rw-r--r-- | src/libGLESv2/renderer/d3d/ProgramD3D.h | 57 | ||||
-rw-r--r-- | src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp | 11 | ||||
-rw-r--r-- | src/libGLESv2/renderer/d3d/d3d11/Renderer11.h | 1 | ||||
-rw-r--r-- | src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp | 6 | ||||
-rw-r--r-- | src/libGLESv2/renderer/d3d/d3d9/Renderer9.h | 1 |
12 files changed, 265 insertions, 92 deletions
diff --git a/src/libGLESv2.gypi b/src/libGLESv2.gypi index 96937a2d..25c464e9 100644 --- a/src/libGLESv2.gypi +++ b/src/libGLESv2.gypi @@ -100,6 +100,7 @@ 'libGLESv2/renderer/Image.h', 'libGLESv2/renderer/IndexRangeCache.cpp', 'libGLESv2/renderer/IndexRangeCache.h', + 'libGLESv2/renderer/ProgramImpl.h', 'libGLESv2/renderer/QueryImpl.h', 'libGLESv2/renderer/RenderTarget.h', 'libGLESv2/renderer/Renderer.cpp', @@ -151,6 +152,8 @@ 'libGLESv2/renderer/d3d/IndexDataManager.h', 'libGLESv2/renderer/d3d/MemoryBuffer.cpp', 'libGLESv2/renderer/d3d/MemoryBuffer.h', + 'libGLESv2/renderer/d3d/ProgramD3D.cpp', + 'libGLESv2/renderer/d3d/ProgramD3D.h', 'libGLESv2/renderer/d3d/ShaderD3D.cpp', 'libGLESv2/renderer/d3d/ShaderD3D.h', 'libGLESv2/renderer/d3d/TextureD3D.cpp', diff --git a/src/libGLESv2/Program.cpp b/src/libGLESv2/Program.cpp index bd9b38b2..9bfda09a 100644 --- a/src/libGLESv2/Program.cpp +++ b/src/libGLESv2/Program.cpp @@ -10,6 +10,7 @@ #include "libGLESv2/Program.h" #include "libGLESv2/ProgramBinary.h" #include "libGLESv2/ResourceManager.h" +#include "libGLESv2/renderer/Renderer.h" namespace gl { @@ -250,7 +251,7 @@ bool Program::link(const Caps &caps) mInfoLog.reset(); resetUniformBlockBindings(); - mProgramBinary.set(new ProgramBinary(mRenderer)); + mProgramBinary.set(new ProgramBinary(mRenderer->createProgram())); mLinked = mProgramBinary->link(mInfoLog, mAttributeBindings, mFragmentShader, mVertexShader, mTransformFeedbackVaryings, mTransformFeedbackBufferMode, caps); @@ -308,8 +309,9 @@ bool Program::setProgramBinary(GLenum binaryFormat, const void *binary, GLsizei mInfoLog.reset(); - mProgramBinary.set(new ProgramBinary(mRenderer)); + mProgramBinary.set(new ProgramBinary(mRenderer->createProgram())); mLinked = mProgramBinary->load(mInfoLog, binaryFormat, binary, length); + if (!mLinked) { mProgramBinary.set(NULL); diff --git a/src/libGLESv2/ProgramBinary.cpp b/src/libGLESv2/ProgramBinary.cpp index 81970546..cd070e20 100644 --- a/src/libGLESv2/ProgramBinary.cpp +++ b/src/libGLESv2/ProgramBinary.cpp @@ -22,6 +22,7 @@ #include "libGLESv2/main.h" #include "libGLESv2/Shader.h" #include "libGLESv2/Program.h" +#include "libGLESv2/renderer/ProgramImpl.h" #include "libGLESv2/renderer/Renderer.h" #include "libGLESv2/renderer/d3d/DynamicHLSL.h" #include "libGLESv2/renderer/d3d/ShaderD3D.h" @@ -188,10 +189,9 @@ LinkedVarying::LinkedVarying(const std::string &name, GLenum type, GLsizei size, unsigned int ProgramBinary::mCurrentSerial = 1; -ProgramBinary::ProgramBinary(rx::Renderer *renderer) +ProgramBinary::ProgramBinary(rx::ProgramImpl *impl) : RefCountObject(0), - mRenderer(renderer), - mDynamicHLSL(NULL), + mProgram(impl), mVertexWorkarounds(rx::ANGLE_D3D_WORKAROUND_NONE), mPixelWorkarounds(rx::ANGLE_D3D_WORKAROUND_NONE), mGeometryExecutable(NULL), @@ -200,11 +200,11 @@ ProgramBinary::ProgramBinary(rx::Renderer *renderer) mUsesPointSize(false), mShaderVersion(100), mDirtySamplerMapping(true), - mVertexUniformStorage(NULL), - mFragmentUniformStorage(NULL), mValidated(false), mSerial(issueSerial()) { + ASSERT(impl); + for (int index = 0; index < MAX_VERTEX_ATTRIBS; index++) { mSemanticIndex[index] = -1; @@ -219,14 +219,12 @@ ProgramBinary::ProgramBinary(rx::Renderer *renderer) { mSamplersVS[index].active = false; } - - mDynamicHLSL = new rx::DynamicHLSL(renderer); } ProgramBinary::~ProgramBinary() { reset(); - SafeDelete(mDynamicHLSL); + SafeDelete(mProgram); } unsigned int ProgramBinary::getSerial() const @@ -277,15 +275,16 @@ rx::ShaderExecutable *ProgramBinary::getPixelExecutableForOutputLayout(const std } } - std::string finalPixelHLSL = mDynamicHLSL->generatePixelShaderForOutputSignature(mPixelHLSL, mPixelShaderKey, mUsesFragDepth, - outputSignature); + std::string finalPixelHLSL = mProgram->getDynamicHLSL()->generatePixelShaderForOutputSignature( + mPixelHLSL, mPixelShaderKey, mUsesFragDepth, outputSignature); // Generate new pixel executable InfoLog tempInfoLog; - rx::ShaderExecutable *pixelExecutable = mRenderer->compileToExecutable(tempInfoLog, finalPixelHLSL.c_str(), rx::SHADER_PIXEL, - mTransformFeedbackLinkedVaryings, - (mTransformFeedbackBufferMode == GL_SEPARATE_ATTRIBS), - mPixelWorkarounds); + rx::Renderer* renderer = mProgram->getRenderer(); + rx::ShaderExecutable *pixelExecutable = renderer->compileToExecutable(tempInfoLog, finalPixelHLSL.c_str(), + rx::SHADER_PIXEL, mTransformFeedbackLinkedVaryings, + (mTransformFeedbackBufferMode == GL_SEPARATE_ATTRIBS), + mPixelWorkarounds); if (!pixelExecutable) { @@ -304,7 +303,7 @@ rx::ShaderExecutable *ProgramBinary::getPixelExecutableForOutputLayout(const std rx::ShaderExecutable *ProgramBinary::getVertexExecutableForInputLayout(const VertexFormat inputLayout[MAX_VERTEX_ATTRIBS]) { GLenum signature[MAX_VERTEX_ATTRIBS]; - mDynamicHLSL->getInputLayoutSignature(inputLayout, signature); + mProgram->getDynamicHLSL()->getInputLayoutSignature(inputLayout, signature); for (size_t executableIndex = 0; executableIndex < mVertexExecutables.size(); executableIndex++) { @@ -315,15 +314,15 @@ rx::ShaderExecutable *ProgramBinary::getVertexExecutableForInputLayout(const Ver } // Generate new dynamic layout with attribute conversions - std::string finalVertexHLSL = mDynamicHLSL->generateVertexShaderForInputLayout(mVertexHLSL, inputLayout, mShaderAttributes); + std::string finalVertexHLSL = mProgram->getDynamicHLSL()->generateVertexShaderForInputLayout(mVertexHLSL, inputLayout, mShaderAttributes); // Generate new vertex executable InfoLog tempInfoLog; - rx::ShaderExecutable *vertexExecutable = mRenderer->compileToExecutable(tempInfoLog, finalVertexHLSL.c_str(), - rx::SHADER_VERTEX, - mTransformFeedbackLinkedVaryings, - (mTransformFeedbackBufferMode == GL_SEPARATE_ATTRIBS), - mVertexWorkarounds); + rx::Renderer* renderer = mProgram->getRenderer(); + rx::ShaderExecutable *vertexExecutable = renderer->compileToExecutable(tempInfoLog, finalVertexHLSL.c_str(), + rx::SHADER_VERTEX, mTransformFeedbackLinkedVaryings, + (mTransformFeedbackBufferMode == GL_SEPARATE_ATTRIBS), + mVertexWorkarounds); if (!vertexExecutable) { @@ -389,7 +388,7 @@ bool ProgramBinary::usesPointSize() const bool ProgramBinary::usesPointSpriteEmulation() const { - return mUsesPointSize && mRenderer->getMajorShaderModel() >= 4; + return mUsesPointSize && mProgram->getRenderer()->getMajorShaderModel() >= 4; } bool ProgramBinary::usesGeometryShader() const @@ -1020,7 +1019,7 @@ void ProgramBinary::applyUniforms() { updateSamplerMapping(); - mRenderer->applyUniforms(*this); + mProgram->getRenderer()->applyUniforms(*this); for (size_t uniformIndex = 0; uniformIndex < mUniforms.size(); uniformIndex++) { @@ -1033,8 +1032,8 @@ bool ProgramBinary::applyUniformBuffers(const std::vector<gl::Buffer*> boundBuff const gl::Buffer *vertexUniformBuffers[gl::IMPLEMENTATION_MAX_VERTEX_SHADER_UNIFORM_BUFFERS] = {NULL}; const gl::Buffer *fragmentUniformBuffers[gl::IMPLEMENTATION_MAX_FRAGMENT_SHADER_UNIFORM_BUFFERS] = {NULL}; - const unsigned int reservedBuffersInVS = mRenderer->getReservedVertexUniformBuffers(); - const unsigned int reservedBuffersInFS = mRenderer->getReservedFragmentUniformBuffers(); + const unsigned int reservedBuffersInVS = mProgram->getRenderer()->getReservedVertexUniformBuffers(); + const unsigned int reservedBuffersInFS = mProgram->getRenderer()->getReservedFragmentUniformBuffers(); ASSERT(boundBuffers.size() == mUniformBlocks.size()); @@ -1074,7 +1073,7 @@ bool ProgramBinary::applyUniformBuffers(const std::vector<gl::Buffer*> boundBuff } } - return mRenderer->setUniformBuffers(vertexUniformBuffers, fragmentUniformBuffers); + return mProgram->getRenderer()->setUniformBuffers(vertexUniformBuffers, fragmentUniformBuffers); } bool ProgramBinary::linkVaryings(InfoLog &infoLog, Shader *fragmentShader, Shader *vertexShader) @@ -1304,7 +1303,7 @@ bool ProgramBinary::load(InfoLog &infoLog, GLenum binaryFormat, const void *bina unsigned int vertexShaderSize = stream.readInt<unsigned int>(); const unsigned char *vertexShaderFunction = reinterpret_cast<const unsigned char*>(binary) + stream.offset(); - rx::ShaderExecutable *shaderExecutable = mRenderer->loadExecutable(reinterpret_cast<const DWORD*>(vertexShaderFunction), + rx::ShaderExecutable *shaderExecutable = mProgram->getRenderer()->loadExecutable(reinterpret_cast<const DWORD*>(vertexShaderFunction), vertexShaderSize, rx::SHADER_VERTEX, mTransformFeedbackLinkedVaryings, (mTransformFeedbackBufferMode == GL_SEPARATE_ATTRIBS)); @@ -1316,7 +1315,7 @@ bool ProgramBinary::load(InfoLog &infoLog, GLenum binaryFormat, const void *bina // generated converted input layout GLenum signature[MAX_VERTEX_ATTRIBS]; - mDynamicHLSL->getInputLayoutSignature(inputLayout, signature); + mProgram->getDynamicHLSL()->getInputLayoutSignature(inputLayout, signature); // add new binary mVertexExecutables.push_back(new VertexExecutable(inputLayout, signature, shaderExecutable)); @@ -1350,10 +1349,11 @@ bool ProgramBinary::load(InfoLog &infoLog, GLenum binaryFormat, const void *bina const size_t pixelShaderSize = stream.readInt<unsigned int>(); const unsigned char *pixelShaderFunction = reinterpret_cast<const unsigned char*>(binary) + stream.offset(); - rx::ShaderExecutable *shaderExecutable = mRenderer->loadExecutable(pixelShaderFunction, pixelShaderSize, - rx::SHADER_PIXEL, - mTransformFeedbackLinkedVaryings, - (mTransformFeedbackBufferMode == GL_SEPARATE_ATTRIBS)); + rx::Renderer *renderer = mProgram->getRenderer(); + rx::ShaderExecutable *shaderExecutable = renderer->loadExecutable(pixelShaderFunction, pixelShaderSize, + rx::SHADER_PIXEL, mTransformFeedbackLinkedVaryings, + (mTransformFeedbackBufferMode == GL_SEPARATE_ATTRIBS)); + if (!shaderExecutable) { infoLog.append("Could not create pixel shader."); @@ -1371,9 +1371,11 @@ bool ProgramBinary::load(InfoLog &infoLog, GLenum binaryFormat, const void *bina if (geometryShaderSize > 0) { const char *geometryShaderFunction = (const char*) binary + stream.offset(); - mGeometryExecutable = mRenderer->loadExecutable(reinterpret_cast<const DWORD*>(geometryShaderFunction), - geometryShaderSize, rx::SHADER_GEOMETRY, mTransformFeedbackLinkedVaryings, - (mTransformFeedbackBufferMode == GL_SEPARATE_ATTRIBS)); + rx::Renderer *renderer = mProgram->getRenderer(); + mGeometryExecutable = renderer->loadExecutable(reinterpret_cast<const DWORD*>(geometryShaderFunction), + geometryShaderSize, rx::SHADER_GEOMETRY, mTransformFeedbackLinkedVaryings, + (mTransformFeedbackBufferMode == GL_SEPARATE_ATTRIBS)); + if (!mGeometryExecutable) { infoLog.append("Could not create geometry shader."); @@ -1387,14 +1389,14 @@ bool ProgramBinary::load(InfoLog &infoLog, GLenum binaryFormat, const void *bina const GUID *binaryIdentifier = (const GUID *) ptr; ptr += sizeof(GUID); - GUID identifier = mRenderer->getAdapterIdentifier(); + GUID identifier = mProgram->getRenderer()->getAdapterIdentifier(); if (memcmp(&identifier, binaryIdentifier, sizeof(GUID)) != 0) { infoLog.append("Invalid program binary."); return false; } - initializeUniformStorage(); + mProgram->initializeUniformStorage(mUniforms); return true; #endif // #ifdef ANGLE_DISABLE_PROGRAM_BINARY_LOAD @@ -1572,7 +1574,7 @@ bool ProgramBinary::save(GLenum *binaryFormat, void *binary, GLsizei bufSize, GL stream.writeBytes(geometryBlob, geometryShaderSize); } - GUID identifier = mRenderer->getAdapterIdentifier(); + GUID identifier = mProgram->getRenderer()->getAdapterIdentifier(); GLsizei streamLength = stream.length(); const void *streamData = stream.data(); @@ -1654,7 +1656,8 @@ bool ProgramBinary::link(InfoLog &infoLog, const AttributeBindings &attributeBin // Map the varyings to the register file rx::VaryingPacking packing = { NULL }; - int registers = mDynamicHLSL->packVaryings(infoLog, packing, fragmentShaderD3D, vertexShaderD3D, transformFeedbackVaryings); + int registers = mProgram->getDynamicHLSL()->packVaryings(infoLog, packing, fragmentShaderD3D, vertexShaderD3D, + transformFeedbackVaryings); if (registers < 0) { @@ -1668,9 +1671,10 @@ bool ProgramBinary::link(InfoLog &infoLog, const AttributeBindings &attributeBin mUsesPointSize = vertexShaderD3D->usesPointSize(); std::vector<LinkedVarying> linkedVaryings; - if (!mDynamicHLSL->generateShaderLinkHLSL(infoLog, registers, packing, mPixelHLSL, mVertexHLSL, - fragmentShaderD3D, vertexShaderD3D, transformFeedbackVaryings, - &linkedVaryings, &mOutputVariables, &mPixelShaderKey, &mUsesFragDepth)) + if (!mProgram->getDynamicHLSL()->generateShaderLinkHLSL(infoLog, registers, packing, mPixelHLSL, mVertexHLSL, + fragmentShaderD3D, vertexShaderD3D, transformFeedbackVaryings, + &linkedVaryings, &mOutputVariables, &mPixelShaderKey, + &mUsesFragDepth)) { return false; } @@ -1719,11 +1723,11 @@ bool ProgramBinary::link(InfoLog &infoLog, const AttributeBindings &attributeBin if (usesGeometryShader()) { - std::string geometryHLSL = mDynamicHLSL->generateGeometryShaderHLSL(registers, fragmentShaderD3D, vertexShaderD3D); - mGeometryExecutable = mRenderer->compileToExecutable(infoLog, geometryHLSL.c_str(), rx::SHADER_GEOMETRY, - mTransformFeedbackLinkedVaryings, - (mTransformFeedbackBufferMode == GL_SEPARATE_ATTRIBS), - rx::ANGLE_D3D_WORKAROUND_NONE); + std::string geometryHLSL = mProgram->getDynamicHLSL()->generateGeometryShaderHLSL(registers, fragmentShaderD3D, vertexShaderD3D); + mGeometryExecutable = mProgram->getRenderer()->compileToExecutable(infoLog, geometryHLSL.c_str(), + rx::SHADER_GEOMETRY, mTransformFeedbackLinkedVaryings, + (mTransformFeedbackBufferMode == GL_SEPARATE_ATTRIBS), + rx::ANGLE_D3D_WORKAROUND_NONE); } if (!defaultVertexExecutable || !defaultPixelExecutable || (usesGeometryShader() && !mGeometryExecutable)) @@ -1980,7 +1984,7 @@ bool ProgramBinary::linkUniforms(InfoLog &infoLog, const Shader &vertexShader, c return false; } - initializeUniformStorage(); + mProgram->initializeUniformStorage(mUniforms); return true; } @@ -2073,7 +2077,7 @@ bool ProgramBinary::indexSamplerUniform(const LinkedUniform &uniform, InfoLog &i return false; } - unsigned int maxVertexVectors = mRenderer->getReservedVertexUniformVectors() + caps.maxVertexUniformVectors; + unsigned int maxVertexVectors = mProgram->getRenderer()->getReservedVertexUniformVectors() + caps.maxVertexUniformVectors; if (uniform.vsRegisterIndex + uniform.registerCount > maxVertexVectors) { infoLog.append("Vertex shader active uniforms exceed GL_MAX_VERTEX_UNIFORM_VECTORS (%u)", @@ -2092,7 +2096,7 @@ bool ProgramBinary::indexSamplerUniform(const LinkedUniform &uniform, InfoLog &i return false; } - unsigned int maxFragmentVectors = mRenderer->getReservedFragmentUniformVectors() + caps.maxFragmentUniformVectors; + unsigned int maxFragmentVectors = mProgram->getRenderer()->getReservedFragmentUniformVectors() + caps.maxFragmentUniformVectors; if (uniform.psRegisterIndex + uniform.registerCount > maxFragmentVectors) { infoLog.append("Fragment shader active uniforms exceed GL_MAX_FRAGMENT_UNIFORM_VECTORS (%u)", @@ -2435,7 +2439,7 @@ bool ProgramBinary::assignUniformBlockRegister(InfoLog &infoLog, UniformBlock *u if (shader == GL_VERTEX_SHADER) { uniformBlock->vsRegisterIndex = registerIndex; - if (registerIndex - mRenderer->getReservedVertexUniformBuffers() >= caps.maxVertexUniformBlocks) + if (registerIndex - mProgram->getRenderer()->getReservedVertexUniformBuffers() >= caps.maxVertexUniformBlocks) { infoLog.append("Vertex shader uniform block count exceed GL_MAX_VERTEX_UNIFORM_BLOCKS (%u)", caps.maxVertexUniformBlocks); return false; @@ -2444,7 +2448,7 @@ bool ProgramBinary::assignUniformBlockRegister(InfoLog &infoLog, UniformBlock *u else if (shader == GL_FRAGMENT_SHADER) { uniformBlock->psRegisterIndex = registerIndex; - if (registerIndex - mRenderer->getReservedFragmentUniformBuffers() >= caps.maxFragmentUniformBlocks) + if (registerIndex - mProgram->getRenderer()->getReservedFragmentUniformBuffers() >= caps.maxFragmentUniformBlocks) { infoLog.append("Fragment shader uniform block count exceed GL_MAX_FRAGMENT_UNIFORM_BLOCKS (%u)", caps.maxFragmentUniformBlocks); return false; @@ -2865,32 +2869,6 @@ void ProgramBinary::sortAttributesByLayout(rx::TranslatedAttribute attributes[MA } } -void ProgramBinary::initializeUniformStorage() -{ - // Compute total default block size - unsigned int vertexRegisters = 0; - unsigned int fragmentRegisters = 0; - for (size_t uniformIndex = 0; uniformIndex < mUniforms.size(); uniformIndex++) - { - const LinkedUniform &uniform = *mUniforms[uniformIndex]; - - if (!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 ProgramBinary::reset() { mVertexHLSL.clear(); @@ -2926,8 +2904,8 @@ void ProgramBinary::reset() SafeDeleteContainer(mUniformBlocks); mUniformIndex.clear(); mOutputVariables.clear(); - SafeDelete(mVertexUniformStorage); - SafeDelete(mFragmentUniformStorage); + + mProgram->reset(); mValidated = false; } diff --git a/src/libGLESv2/ProgramBinary.h b/src/libGLESv2/ProgramBinary.h index b51b7b16..3c9316fe 100644 --- a/src/libGLESv2/ProgramBinary.h +++ b/src/libGLESv2/ProgramBinary.h @@ -47,6 +47,7 @@ class ShaderExecutable; class Renderer; struct TranslatedAttribute; class UniformStorage; +class ProgramImpl; } namespace gl @@ -94,9 +95,12 @@ struct LinkedVarying class ProgramBinary : public RefCountObject { public: - explicit ProgramBinary(rx::Renderer *renderer); + explicit ProgramBinary(rx::ProgramImpl *impl); ~ProgramBinary(); + rx::ProgramImpl *getImplementation() { return mProgram; } + const rx::ProgramImpl *getImplementation() const { return mProgram; } + rx::ShaderExecutable *getPixelExecutableForFramebuffer(const Framebuffer *fbo); rx::ShaderExecutable *getPixelExecutableForOutputLayout(const std::vector<GLenum> &outputLayout); rx::ShaderExecutable *getVertexExecutableForInputLayout(const VertexFormat inputLayout[MAX_VERTEX_ATTRIBS]); @@ -189,8 +193,6 @@ class ProgramBinary : public RefCountObject void sortAttributesByLayout(rx::TranslatedAttribute attributes[MAX_VERTEX_ATTRIBS], int sortedSemanticIndices[MAX_VERTEX_ATTRIBS]) const; const std::vector<LinkedUniform*> &getUniforms() const { return mUniforms; } - const rx::UniformStorage &getVertexUniformStorage() const { return *mVertexUniformStorage; } - const rx::UniformStorage &getFragmentUniformStorage() const { return *mFragmentUniformStorage; } private: DISALLOW_COPY_AND_ASSIGN(ProgramBinary); @@ -239,7 +241,6 @@ class ProgramBinary : public RefCountObject bool defineUniformBlock(InfoLog &infoLog, const Shader &shader, const sh::InterfaceBlock &interfaceBlock, const Caps &caps); bool assignUniformBlockRegister(InfoLog &infoLog, UniformBlock *uniformBlock, GLenum shader, unsigned int registerIndex, const Caps &caps); void defineOutputVariables(Shader *fragmentShader); - void initializeUniformStorage(); template <typename T> void setUniform(GLint location, GLsizei count, const T* v, GLenum targetUniformType); @@ -286,8 +287,7 @@ class ProgramBinary : public RefCountObject rx::ShaderExecutable *mShaderExecutable; }; - rx::Renderer *const mRenderer; - rx::DynamicHLSL *mDynamicHLSL; + rx::ProgramImpl *mProgram; std::string mVertexHLSL; rx::D3DWorkaroundType mVertexWorkarounds; @@ -321,8 +321,6 @@ class ProgramBinary : public RefCountObject std::vector<UniformBlock*> mUniformBlocks; std::vector<VariableLocation> mUniformIndex; std::map<int, VariableLocation> mOutputVariables; - rx::UniformStorage *mVertexUniformStorage; - rx::UniformStorage *mFragmentUniformStorage; bool mValidated; diff --git a/src/libGLESv2/renderer/ProgramImpl.h b/src/libGLESv2/renderer/ProgramImpl.h new file mode 100644 index 00000000..28c026a2 --- /dev/null +++ b/src/libGLESv2/renderer/ProgramImpl.h @@ -0,0 +1,37 @@ +// +// Copyright 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. +// + +// ProgramImpl.h: Defines the abstract rx::ProgramImpl class. + +#ifndef LIBGLESV2_RENDERER_PROGRAMIMPL_H_ +#define LIBGLESV2_RENDERER_PROGRAMIMPL_H_ + +#include "common/angleutils.h" +#include "libGLESv2/Constants.h" +#include "libGLESv2/ProgramBinary.h" + +namespace rx +{ + +class DynamicHLSL; +class Renderer; + +class ProgramImpl +{ +public: + virtual ~ProgramImpl() { } + + // TODO: Temporary interfaces to ease migration. Remove soon! + virtual Renderer *getRenderer() = 0; + virtual DynamicHLSL *getDynamicHLSL() = 0; + virtual void initializeUniformStorage(const std::vector<gl::LinkedUniform*> &uniforms) = 0; + + virtual void reset() = 0; +}; + +} + +#endif // LIBGLESV2_RENDERER_PROGRAMIMPL_H_ diff --git a/src/libGLESv2/renderer/Renderer.h b/src/libGLESv2/renderer/Renderer.h index 7216be91..0148ed71 100644 --- a/src/libGLESv2/renderer/Renderer.h +++ b/src/libGLESv2/renderer/Renderer.h @@ -57,6 +57,7 @@ class VertexArrayImpl; class BufferStorage; struct TranslatedIndexData; class ShaderImpl; +class ProgramImpl; class ShaderExecutable; class SwapChain; class RenderTarget; @@ -198,6 +199,7 @@ class Renderer // Shader creation virtual ShaderImpl *createShader(GLenum type) = 0; + virtual ProgramImpl *createProgram() = 0; // Shader operations virtual void releaseShaderCompiler() = 0; diff --git a/src/libGLESv2/renderer/d3d/ProgramD3D.cpp b/src/libGLESv2/renderer/d3d/ProgramD3D.cpp new file mode 100644 index 00000000..87e01323 --- /dev/null +++ b/src/libGLESv2/renderer/d3d/ProgramD3D.cpp @@ -0,0 +1,81 @@ +// +// 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<ProgramD3D*>(impl); +} + +const ProgramD3D *ProgramD3D::makeProgramD3D(const ProgramImpl *impl) +{ + ASSERT(HAS_DYNAMIC_TYPE(const ProgramD3D*, impl)); + return static_cast<const ProgramD3D*>(impl); +} + +void ProgramD3D::initializeUniformStorage(const std::vector<gl::LinkedUniform*> &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); +} + +} diff --git a/src/libGLESv2/renderer/d3d/ProgramD3D.h b/src/libGLESv2/renderer/d3d/ProgramD3D.h new file mode 100644 index 00000000..3dd3b1f4 --- /dev/null +++ b/src/libGLESv2/renderer/d3d/ProgramD3D.h @@ -0,0 +1,57 @@ +// +// 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.h: Defines the rx::ProgramD3D class which implements rx::ProgramImpl. + +#ifndef LIBGLESV2_RENDERER_PROGRAMD3D_H_ +#define LIBGLESV2_RENDERER_PROGRAMD3D_H_ + +#include "libGLESv2/renderer/ProgramImpl.h" + +namespace gl +{ +struct LinkedUniform; +struct VertexFormat; +} + +namespace rx +{ + +class UniformStorage; + +class ProgramD3D : public ProgramImpl +{ + public: + ProgramD3D(rx::Renderer *renderer); + virtual ~ProgramD3D(); + + static ProgramD3D *makeProgramD3D(ProgramImpl *impl); + static const ProgramD3D *makeProgramD3D(const ProgramImpl *impl); + + Renderer *getRenderer() { return mRenderer; } + DynamicHLSL *getDynamicHLSL() { return mDynamicHLSL; } + + // D3D only + void initializeUniformStorage(const std::vector<gl::LinkedUniform*> &uniforms); + + const UniformStorage &getVertexUniformStorage() const { return *mVertexUniformStorage; } + const UniformStorage &getFragmentUniformStorage() const { return *mFragmentUniformStorage; } + + void reset(); + + private: + DISALLOW_COPY_AND_ASSIGN(ProgramD3D); + + Renderer *mRenderer; + DynamicHLSL *mDynamicHLSL; + + UniformStorage *mVertexUniformStorage; + UniformStorage *mFragmentUniformStorage; +}; + +} + +#endif // LIBGLESV2_RENDERER_PROGRAMD3D_H_ diff --git a/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp b/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp index fba179f7..5e45e2b1 100644 --- a/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp +++ b/src/libGLESv2/renderer/d3d/d3d11/Renderer11.cpp @@ -11,6 +11,7 @@ #include "libGLESv2/FramebufferAttachment.h" #include "libGLESv2/ProgramBinary.h" #include "libGLESv2/Framebuffer.h" +#include "libGLESv2/renderer/d3d/ProgramD3D.h" #include "libGLESv2/renderer/d3d/ShaderD3D.h" #include "libGLESv2/renderer/d3d/TextureD3D.h" #include "libGLESv2/renderer/d3d/TransformFeedbackD3D.h" @@ -1392,8 +1393,9 @@ void Renderer11::applyUniforms(const gl::ProgramBinary &programBinary) } } - const UniformStorage11 *vertexUniformStorage = UniformStorage11::makeUniformStorage11(&programBinary.getVertexUniformStorage()); - const UniformStorage11 *fragmentUniformStorage = UniformStorage11::makeUniformStorage11(&programBinary.getFragmentUniformStorage()); + const ProgramD3D *programD3D = ProgramD3D::makeProgramD3D(programBinary.getImplementation()); + const UniformStorage11 *vertexUniformStorage = UniformStorage11::makeUniformStorage11(&programD3D->getVertexUniformStorage()); + const UniformStorage11 *fragmentUniformStorage = UniformStorage11::makeUniformStorage11(&programD3D->getFragmentUniformStorage()); ASSERT(vertexUniformStorage); ASSERT(fragmentUniformStorage); @@ -2217,6 +2219,11 @@ ShaderImpl *Renderer11::createShader(GLenum type) return new ShaderD3D(type, this); } +ProgramImpl *Renderer11::createProgram() +{ + return new ProgramD3D(this); +} + void Renderer11::releaseShaderCompiler() { ShaderD3D::releaseCompiler(); diff --git a/src/libGLESv2/renderer/d3d/d3d11/Renderer11.h b/src/libGLESv2/renderer/d3d/d3d11/Renderer11.h index 865de21a..64de7b03 100644 --- a/src/libGLESv2/renderer/d3d/d3d11/Renderer11.h +++ b/src/libGLESv2/renderer/d3d/d3d11/Renderer11.h @@ -141,6 +141,7 @@ class Renderer11 : public Renderer // Shader creation virtual ShaderImpl *createShader(GLenum type); + virtual ProgramImpl *createProgram(); // Shader operations virtual void releaseShaderCompiler(); diff --git a/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp b/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp index e3615f46..5136829e 100644 --- a/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp +++ b/src/libGLESv2/renderer/d3d/d3d9/Renderer9.cpp @@ -22,6 +22,7 @@ #include "libGLESv2/renderer/d3d/d3d9/Fence9.h" #include "libGLESv2/renderer/d3d/d3d9/VertexArray9.h" #include "libGLESv2/renderer/d3d/IndexDataManager.h" +#include "libGLESv2/renderer/d3d/ProgramD3D.h" #include "libGLESv2/renderer/d3d/ShaderD3D.h" #include "libGLESv2/renderer/d3d/TextureD3D.h" #include "libGLESv2/renderer/d3d/TransformFeedbackD3D.h" @@ -2766,6 +2767,11 @@ ShaderImpl *Renderer9::createShader(GLenum type) return new ShaderD3D(type, this); } +ProgramImpl *Renderer9::createProgram() +{ + return new ProgramD3D(this); +} + void Renderer9::releaseShaderCompiler() { ShaderD3D::releaseCompiler(); diff --git a/src/libGLESv2/renderer/d3d/d3d9/Renderer9.h b/src/libGLESv2/renderer/d3d/d3d9/Renderer9.h index 826a649d..84e64dc1 100644 --- a/src/libGLESv2/renderer/d3d/d3d9/Renderer9.h +++ b/src/libGLESv2/renderer/d3d/d3d9/Renderer9.h @@ -144,6 +144,7 @@ class Renderer9 : public Renderer // Shader creation virtual ShaderImpl *createShader(GLenum type); + virtual ProgramImpl *createProgram(); // Shader operations virtual void releaseShaderCompiler(); |