Commit c9610c51 by Brandon Jones

Starting refactor of ProgramBinary

This is gonna take a while... BUG=angle:731 Change-Id: Ief72c3361b6429f3f6e0bc2d2ea0810d523ff178 Reviewed-on: https://chromium-review.googlesource.com/215661Tested-by: 's avatarBrandon Jones <bajones@chromium.org> Reviewed-by: 's avatarShannon Woods <shannonwoods@chromium.org>
parent eeb7b0e9
......@@ -244,6 +244,7 @@
<ClInclude Include="..\..\src\libGLESv2\renderer\ShaderImpl.h"/>
<ClInclude Include="..\..\src\libGLESv2\renderer\TransformFeedbackImpl.h"/>
<ClInclude Include="..\..\src\libGLESv2\renderer\ShaderExecutable.h"/>
<ClInclude Include="..\..\src\libGLESv2\renderer\ProgramImpl.h"/>
<ClInclude Include="..\..\src\libGLESv2\renderer\loadimage.h"/>
<ClInclude Include="..\..\src\libGLESv2\renderer\copyimage.h"/>
<ClInclude Include="..\..\src\libGLESv2\renderer\BufferImpl.h"/>
......@@ -262,6 +263,7 @@
<ClInclude Include="..\..\src\libGLESv2\renderer\d3d\IndexBuffer.h"/>
<ClInclude Include="..\..\src\libGLESv2\renderer\d3d\HLSLCompiler.h"/>
<ClInclude Include="..\..\src\libGLESv2\renderer\d3d\ImageD3D.h"/>
<ClInclude Include="..\..\src\libGLESv2\renderer\d3d\ProgramD3D.h"/>
<ClInclude Include="..\..\src\libGLESv2\renderer\d3d\MemoryBuffer.h"/>
<ClInclude Include="..\..\src\libGLESv2\renderer\d3d\TextureD3D.h"/>
<ClInclude Include="..\..\src\libGLESv2\renderer\d3d\TextureStorage.h"/>
......@@ -429,6 +431,7 @@
<ClCompile Include="..\..\src\libGLESv2\renderer\d3d\DynamicHLSL.cpp"/>
<ClCompile Include="..\..\src\libGLESv2\renderer\d3d\ShaderD3D.cpp"/>
<ClCompile Include="..\..\src\libGLESv2\renderer\d3d\BufferD3D.cpp"/>
<ClCompile Include="..\..\src\libGLESv2\renderer\d3d\ProgramD3D.cpp"/>
<ClCompile Include="..\..\src\libGLESv2\renderer\d3d\IndexBuffer.cpp"/>
<ClCompile Include="..\..\src\libGLESv2\renderer\d3d\VertexBuffer.cpp"/>
<ClCompile Include="..\..\src\libGLESv2\renderer\d3d\TextureD3D.cpp"/>
......
......@@ -267,6 +267,9 @@
<ClInclude Include="..\..\src\libGLESv2\renderer\ShaderExecutable.h">
<Filter>src\libGLESv2\renderer</Filter>
</ClInclude>
<ClInclude Include="..\..\src\libGLESv2\renderer\ProgramImpl.h">
<Filter>src\libGLESv2\renderer</Filter>
</ClInclude>
<ClInclude Include="..\..\src\libGLESv2\renderer\loadimage.h">
<Filter>src\libGLESv2\renderer</Filter>
</ClInclude>
......@@ -354,12 +357,18 @@
<ClInclude Include="..\..\src\libGLESv2\renderer\d3d\ImageD3D.h">
<Filter>src\libGLESv2\renderer\d3d</Filter>
</ClInclude>
<ClInclude Include="..\..\src\libGLESv2\renderer\d3d\ProgramD3D.h">
<Filter>src\libGLESv2\renderer\d3d</Filter>
</ClInclude>
<ClCompile Include="..\..\src\libGLESv2\renderer\d3d\BufferD3D.cpp">
<Filter>src\libGLESv2\renderer\d3d</Filter>
</ClCompile>
<ClInclude Include="..\..\src\libGLESv2\renderer\d3d\MemoryBuffer.h">
<Filter>src\libGLESv2\renderer\d3d</Filter>
</ClInclude>
<ClCompile Include="..\..\src\libGLESv2\renderer\d3d\ProgramD3D.cpp">
<Filter>src\libGLESv2\renderer\d3d</Filter>
</ClCompile>
<ClCompile Include="..\..\src\libGLESv2\renderer\d3d\IndexBuffer.cpp">
<Filter>src\libGLESv2\renderer\d3d</Filter>
</ClCompile>
......
......@@ -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',
......
......@@ -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);
......
......@@ -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;
......
//
// 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_
......@@ -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;
......
//
// 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);
}
}
//
// 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_
......@@ -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();
......
......@@ -141,6 +141,7 @@ class Renderer11 : public Renderer
// Shader creation
virtual ShaderImpl *createShader(GLenum type);
virtual ProgramImpl *createProgram();
// Shader operations
virtual void releaseShaderCompiler();
......
......@@ -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();
......
......@@ -144,6 +144,7 @@ class Renderer9 : public Renderer
// Shader creation
virtual ShaderImpl *createShader(GLenum type);
virtual ProgramImpl *createProgram();
// Shader operations
virtual void releaseShaderCompiler();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment