blob: 0589a3b23d1968d1f8f0263970a561d7ff616787 [file] [log] [blame]
//
// 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.
//
// ShaderD3D.h: Defines the rx::ShaderD3D class which implements rx::ShaderImpl.
#ifndef LIBANGLE_RENDERER_D3D_SHADERD3D_H_
#define LIBANGLE_RENDERER_D3D_SHADERD3D_H_
#include "libANGLE/renderer/ShaderImpl.h"
#include <map>
namespace angle
{
struct CompilerWorkaroundsD3D;
struct FeaturesD3D;
} // namespace angle
namespace gl
{
struct Extensions;
}
namespace rx
{
class DynamicHLSL;
class RendererD3D;
struct D3DUniform;
class ShaderD3D : public ShaderImpl
{
public:
ShaderD3D(const gl::ShaderState &data,
const angle::FeaturesD3D &features,
const gl::Extensions &extensions);
~ShaderD3D() override;
std::shared_ptr<WaitableCompileEvent> compile(const gl::Context *context,
gl::ShCompilerInstance *compilerInstance,
ShCompileOptions options) override;
std::string getDebugInfo() const override;
// D3D-specific methods
void uncompile();
bool hasUniform(const std::string &name) const;
// Query regular uniforms with their name. Query sampler fields of structs with field selection
// using dot (.) operator.
unsigned int getUniformRegister(const std::string &uniformName) const;
unsigned int getUniformBlockRegister(const std::string &blockName) const;
unsigned int getShaderStorageBlockRegister(const std::string &blockName) const;
unsigned int getReadonlyImage2DRegisterIndex() const { return mReadonlyImage2DRegisterIndex; }
unsigned int getImage2DRegisterIndex() const { return mImage2DRegisterIndex; }
bool useImage2DFunction(const std::string &functionName) const;
void appendDebugInfo(const std::string &info) const { mDebugInfo += info; }
void generateWorkarounds(angle::CompilerWorkaroundsD3D *workarounds) const;
bool usesMultipleRenderTargets() const { return mUsesMultipleRenderTargets; }
bool usesFragColor() const { return mUsesFragColor; }
bool usesFragData() const { return mUsesFragData; }
bool usesSecondaryColor() const { return mUsesSecondaryColor; }
bool usesFragCoord() const { return mUsesFragCoord; }
bool usesFrontFacing() const { return mUsesFrontFacing; }
bool usesPointSize() const { return mUsesPointSize; }
bool usesPointCoord() const { return mUsesPointCoord; }
bool usesDepthRange() const { return mUsesDepthRange; }
bool usesFragDepth() const { return mUsesFragDepth; }
bool usesVertexID() const { return mUsesVertexID; }
bool usesViewID() const { return mUsesViewID; }
bool hasANGLEMultiviewEnabled() const { return mHasANGLEMultiviewEnabled; }
ShShaderOutput getCompilerOutputType() const;
private:
bool mUsesMultipleRenderTargets;
bool mUsesFragColor;
bool mUsesFragData;
bool mUsesSecondaryColor;
bool mUsesFragCoord;
bool mUsesFrontFacing;
bool mUsesPointSize;
bool mUsesPointCoord;
bool mUsesDepthRange;
bool mUsesFragDepth;
bool mHasANGLEMultiviewEnabled;
bool mUsesVertexID;
bool mUsesViewID;
bool mUsesDiscardRewriting;
bool mUsesNestedBreak;
bool mRequiresIEEEStrictCompiling;
ShShaderOutput mCompilerOutputType;
mutable std::string mDebugInfo;
std::map<std::string, unsigned int> mUniformRegisterMap;
std::map<std::string, unsigned int> mUniformBlockRegisterMap;
std::map<std::string, unsigned int> mShaderStorageBlockRegisterMap;
unsigned int mReadonlyImage2DRegisterIndex;
unsigned int mImage2DRegisterIndex;
std::set<std::string> mUsedImage2DFunctionNames;
ShCompileOptions mAdditionalOptions;
};
} // namespace rx
#endif // LIBANGLE_RENDERER_D3D_SHADERD3D_H_