Commit 120040e2 by Jamie Madill Committed by Commit Bot

D3D: Move some HLSL-specific code to a new folder.

This code doesn't actually call any D3D runtime methods, so it can be included in our cross platform unit tests. Just include the varying packing code for now. BUG=angleproject:1296 BUG=angleproject:1638 Change-Id: I5c0ccccb00e1c13ca98448256be048f7cd0968ce Reviewed-on: https://chromium-review.googlesource.com/417116 Commit-Queue: Jamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent dceacf5b
...@@ -319,6 +319,10 @@ static_library("libANGLE") { ...@@ -319,6 +319,10 @@ static_library("libANGLE") {
defines += [ "ANGLE_PRELOADED_D3DCOMPILER_MODULE_NAMES={ " + "\"d3dcompiler_47.dll\", \"d3dcompiler_46.dll\", \"d3dcompiler_43.dll\" }" ] defines += [ "ANGLE_PRELOADED_D3DCOMPILER_MODULE_NAMES={ " + "\"d3dcompiler_47.dll\", \"d3dcompiler_46.dll\", \"d3dcompiler_43.dll\" }" ]
} }
if (angle_enable_hlsl) {
sources += rebase_path(gles_gypi.libangle_d3d_hlsl_sources, ".", "src")
}
if (angle_enable_d3d9) { if (angle_enable_d3d9) {
sources += rebase_path(gles_gypi.libangle_d3d9_sources, ".", "src") sources += rebase_path(gles_gypi.libangle_d3d9_sources, ".", "src")
libs += [ "d3d9.lib" ] libs += [ "d3d9.lib" ]
......
...@@ -336,6 +336,11 @@ inline GLenum FramebufferBindingToEnum(FramebufferBinding binding) ...@@ -336,6 +336,11 @@ inline GLenum FramebufferBindingToEnum(FramebufferBinding binding)
return GL_NONE; return GL_NONE;
} }
} }
} } // namespace angle
namespace gl
{
class ContextState;
} // namespace gl
#endif // LIBANGLE_ANGLETYPES_H_ #endif // LIBANGLE_ANGLETYPES_H_
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
#include "libANGLE/renderer/d3d/ProgramD3D.h" #include "libANGLE/renderer/d3d/ProgramD3D.h"
#include "libANGLE/renderer/d3d/RendererD3D.h" #include "libANGLE/renderer/d3d/RendererD3D.h"
#include "libANGLE/renderer/d3d/ShaderD3D.h" #include "libANGLE/renderer/d3d/ShaderD3D.h"
#include "libANGLE/renderer/d3d/VaryingPacking.h" #include "libANGLE/renderer/d3d/hlsl/VaryingPacking.h"
using namespace gl; using namespace gl;
...@@ -121,13 +121,6 @@ constexpr const char *VERTEX_ATTRIBUTE_STUB_STRING = "@@ VERTEX ATTRIBUTES @@"; ...@@ -121,13 +121,6 @@ constexpr const char *VERTEX_ATTRIBUTE_STUB_STRING = "@@ VERTEX ATTRIBUTES @@";
constexpr const char *PIXEL_OUTPUT_STUB_STRING = "@@ PIXEL OUTPUT @@"; constexpr const char *PIXEL_OUTPUT_STUB_STRING = "@@ PIXEL OUTPUT @@";
} // anonymous namespace } // anonymous namespace
std::string GetVaryingSemantic(int majorShaderModel, bool programUsesPointSize)
{
// SM3 reserves the TEXCOORD semantic for point sprite texcoords (gl_PointCoord)
// In D3D11 we manually compute gl_PointCoord in the GS.
return ((programUsesPointSize && majorShaderModel < 4) ? "COLOR" : "TEXCOORD");
}
// DynamicHLSL implementation // DynamicHLSL implementation
DynamicHLSL::DynamicHLSL(RendererD3D *const renderer) : mRenderer(renderer) DynamicHLSL::DynamicHLSL(RendererD3D *const renderer) : mRenderer(renderer)
......
...@@ -97,7 +97,6 @@ class DynamicHLSL : angle::NonCopyable ...@@ -97,7 +97,6 @@ class DynamicHLSL : angle::NonCopyable
const sh::ShaderVariable &shaderAttrib) const; const sh::ShaderVariable &shaderAttrib) const;
}; };
std::string GetVaryingSemantic(int majorShaderModel, bool programUsesPointSize);
} }
#endif // LIBANGLE_RENDERER_D3D_DYNAMICHLSL_H_ #endif // LIBANGLE_RENDERER_D3D_DYNAMICHLSL_H_
...@@ -21,8 +21,8 @@ ...@@ -21,8 +21,8 @@
#include "libANGLE/renderer/d3d/RendererD3D.h" #include "libANGLE/renderer/d3d/RendererD3D.h"
#include "libANGLE/renderer/d3d/ShaderD3D.h" #include "libANGLE/renderer/d3d/ShaderD3D.h"
#include "libANGLE/renderer/d3d/ShaderExecutableD3D.h" #include "libANGLE/renderer/d3d/ShaderExecutableD3D.h"
#include "libANGLE/renderer/d3d/VaryingPacking.h"
#include "libANGLE/renderer/d3d/VertexDataManager.h" #include "libANGLE/renderer/d3d/VertexDataManager.h"
#include "libANGLE/renderer/d3d/hlsl/VaryingPacking.h"
using namespace angle; using namespace angle;
...@@ -473,6 +473,60 @@ const ShaderD3D *ProgramD3DMetadata::getFragmentShader() const ...@@ -473,6 +473,60 @@ const ShaderD3D *ProgramD3DMetadata::getFragmentShader() const
return mFragmentShader; return mFragmentShader;
} }
void ProgramD3DMetadata::updatePackingBuiltins(ShaderType shaderType, VaryingPacking *packing)
{
const std::string &userSemantic =
GetVaryingSemantic(mRendererMajorShaderModel, usesSystemValuePointSize());
unsigned int reservedSemanticIndex = packing->getMaxSemanticIndex();
VaryingPacking::BuiltinInfo *builtins = &packing->builtins(shaderType);
if (mRendererMajorShaderModel >= 4)
{
builtins->dxPosition.enableSystem("SV_Position");
}
else if (shaderType == SHADER_PIXEL)
{
builtins->dxPosition.enableSystem("VPOS");
}
else
{
builtins->dxPosition.enableSystem("POSITION");
}
if (usesTransformFeedbackGLPosition())
{
builtins->glPosition.enable(userSemantic, reservedSemanticIndex++);
}
if (usesFragCoord())
{
builtins->glFragCoord.enable(userSemantic, reservedSemanticIndex++);
}
if (shaderType == SHADER_VERTEX ? addsPointCoordToVertexShader() : usesPointCoord())
{
// SM3 reserves the TEXCOORD semantic for point sprite texcoords (gl_PointCoord)
// In D3D11 we manually compute gl_PointCoord in the GS.
if (mRendererMajorShaderModel >= 4)
{
builtins->glPointCoord.enable(userSemantic, reservedSemanticIndex++);
}
else
{
builtins->glPointCoord.enable("TEXCOORD", 0);
}
}
// Special case: do not include PSIZE semantic in HLSL 3 pixel shaders
if (usesSystemValuePointSize() &&
(shaderType != SHADER_PIXEL || mRendererMajorShaderModel >= 4))
{
builtins->glPointSize.enableSystem("PSIZE");
}
}
// ProgramD3D Implementation // ProgramD3D Implementation
ProgramD3D::VertexExecutable::VertexExecutable(const gl::InputLayout &inputLayout, ProgramD3D::VertexExecutable::VertexExecutable(const gl::InputLayout &inputLayout,
...@@ -1444,8 +1498,8 @@ LinkResult ProgramD3D::link(const gl::ContextState &data, gl::InfoLog &infoLog) ...@@ -1444,8 +1498,8 @@ LinkResult ProgramD3D::link(const gl::ContextState &data, gl::InfoLog &infoLog)
ProgramD3DMetadata metadata(mRenderer, vertexShaderD3D, fragmentShaderD3D); ProgramD3DMetadata metadata(mRenderer, vertexShaderD3D, fragmentShaderD3D);
varyingPacking.enableBuiltins(SHADER_VERTEX, metadata); metadata.updatePackingBuiltins(SHADER_VERTEX, &varyingPacking);
varyingPacking.enableBuiltins(SHADER_PIXEL, metadata); metadata.updatePackingBuiltins(SHADER_PIXEL, &varyingPacking);
if (static_cast<GLuint>(varyingPacking.getRegisterCount()) > data.getCaps().maxVaryingVectors) if (static_cast<GLuint>(varyingPacking.getRegisterCount()) > data.getCaps().maxVaryingVectors)
{ {
...@@ -1486,7 +1540,7 @@ LinkResult ProgramD3D::link(const gl::ContextState &data, gl::InfoLog &infoLog) ...@@ -1486,7 +1540,7 @@ LinkResult ProgramD3D::link(const gl::ContextState &data, gl::InfoLog &infoLog)
if (mRenderer->getMajorShaderModel() >= 4) if (mRenderer->getMajorShaderModel() >= 4)
{ {
varyingPacking.enableBuiltins(SHADER_GEOMETRY, metadata); metadata.updatePackingBuiltins(SHADER_GEOMETRY, &varyingPacking);
mGeometryShaderPreamble = mDynamicHLSL->generateGeometryShaderPreamble(varyingPacking); mGeometryShaderPreamble = mDynamicHLSL->generateGeometryShaderPreamble(varyingPacking);
} }
......
...@@ -119,6 +119,9 @@ class ProgramD3DMetadata final : angle::NonCopyable ...@@ -119,6 +119,9 @@ class ProgramD3DMetadata final : angle::NonCopyable
GLint getMajorShaderVersion() const; GLint getMajorShaderVersion() const;
const ShaderD3D *getFragmentShader() const; const ShaderD3D *getFragmentShader() const;
// Applies the metadata structure to the varying packing.
void updatePackingBuiltins(ShaderType shaderType, VaryingPacking *packing);
private: private:
const int mRendererMajorShaderModel; const int mRendererMajorShaderModel;
const std::string mShaderModelSuffix; const std::string mShaderModelSuffix;
......
...@@ -9,20 +9,20 @@ ...@@ -9,20 +9,20 @@
#ifndef LIBANGLE_RENDERER_D3D_RENDERERD3D_H_ #ifndef LIBANGLE_RENDERER_D3D_RENDERERD3D_H_
#define LIBANGLE_RENDERER_D3D_RENDERERD3D_H_ #define LIBANGLE_RENDERER_D3D_RENDERERD3D_H_
#include <array>
#include "common/debug.h" #include "common/debug.h"
#include "common/MemoryBuffer.h" #include "common/MemoryBuffer.h"
#include "libANGLE/ContextState.h" #include "libANGLE/ContextState.h"
#include "libANGLE/Device.h" #include "libANGLE/Device.h"
#include "libANGLE/formatutils.h" #include "libANGLE/formatutils.h"
#include "libANGLE/renderer/d3d/VertexDataManager.h" #include "libANGLE/renderer/d3d/VertexDataManager.h"
#include "libANGLE/renderer/d3d/formatutilsD3D.h"
#include "libANGLE/renderer/d3d/WorkaroundsD3D.h" #include "libANGLE/renderer/d3d/WorkaroundsD3D.h"
#include "libANGLE/renderer/d3d/hlsl/hlsl_utils.h"
#include "libANGLE/renderer/d3d/formatutilsD3D.h"
#include "libANGLE/Version.h" #include "libANGLE/Version.h"
#include "libANGLE/WorkerThread.h" #include "libANGLE/WorkerThread.h"
//FIXME(jmadill): std::array is currently prohibited by Chromium style guide
#include <array>
namespace egl namespace egl
{ {
class ConfigSet; class ConfigSet;
...@@ -56,14 +56,6 @@ struct TranslatedIndexData; ...@@ -56,14 +56,6 @@ struct TranslatedIndexData;
class UniformStorageD3D; class UniformStorageD3D;
class VertexBuffer; class VertexBuffer;
enum ShaderType
{
SHADER_VERTEX,
SHADER_PIXEL,
SHADER_GEOMETRY,
SHADER_TYPE_MAX
};
struct DeviceIdentifier struct DeviceIdentifier
{ {
UINT VendorId; UINT VendorId;
......
...@@ -8,12 +8,11 @@ ...@@ -8,12 +8,11 @@
// for linking between shader stages. // for linking between shader stages.
// //
#include "libANGLE/renderer/d3d/VaryingPacking.h" #include "libANGLE/renderer/d3d/hlsl/VaryingPacking.h"
#include "common/utilities.h" #include "common/utilities.h"
#include "compiler/translator/blocklayoutHLSL.h" #include "compiler/translator/blocklayoutHLSL.h"
#include "libANGLE/renderer/d3d/DynamicHLSL.h" #include "libANGLE/Program.h"
#include "libANGLE/renderer/d3d/ProgramD3D.h"
namespace rx namespace rx
{ {
...@@ -158,7 +157,7 @@ bool VaryingPacking::packVarying(const PackedVarying &packedVarying) ...@@ -158,7 +157,7 @@ bool VaryingPacking::packVarying(const PackedVarying &packedVarying)
registerInfo.registerRow = row + arrayIndex; registerInfo.registerRow = row + arrayIndex;
registerInfo.registerColumn = bestColumn; registerInfo.registerColumn = bestColumn;
registerInfo.varyingArrayIndex = arrayIndex; registerInfo.varyingArrayIndex = arrayIndex;
registerInfo.varyingRowIndex = 0; registerInfo.varyingRowIndex = 0;
mRegisterList.push_back(registerInfo); mRegisterList.push_back(registerInfo);
mRegisterMap[row + arrayIndex][bestColumn] = true; mRegisterMap[row + arrayIndex][bestColumn] = true;
} }
...@@ -213,8 +212,8 @@ void VaryingPacking::insert(unsigned int registerRow, ...@@ -213,8 +212,8 @@ void VaryingPacking::insert(unsigned int registerRow,
{ {
for (unsigned int varyingRow = 0; varyingRow < varyingRows; ++varyingRow) for (unsigned int varyingRow = 0; varyingRow < varyingRows; ++varyingRow)
{ {
registerInfo.registerRow = registerRow + (arrayElement * varyingRows) + varyingRow; registerInfo.registerRow = registerRow + (arrayElement * varyingRows) + varyingRow;
registerInfo.varyingRowIndex = varyingRow; registerInfo.varyingRowIndex = varyingRow;
registerInfo.varyingArrayIndex = arrayElement; registerInfo.varyingArrayIndex = arrayElement;
mRegisterList.push_back(registerInfo); mRegisterList.push_back(registerInfo);
...@@ -338,64 +337,4 @@ unsigned int VaryingPacking::getRegisterCount() const ...@@ -338,64 +337,4 @@ unsigned int VaryingPacking::getRegisterCount() const
return count; return count;
} }
void VaryingPacking::enableBuiltins(ShaderType shaderType,
const ProgramD3DMetadata &programMetadata)
{
int majorShaderModel = programMetadata.getRendererMajorShaderModel();
bool position = programMetadata.usesTransformFeedbackGLPosition();
bool fragCoord = programMetadata.usesFragCoord();
bool pointCoord = shaderType == SHADER_VERTEX ? programMetadata.addsPointCoordToVertexShader()
: programMetadata.usesPointCoord();
bool pointSize = programMetadata.usesSystemValuePointSize();
bool hlsl4 = (majorShaderModel >= 4);
const std::string &userSemantic = GetVaryingSemantic(majorShaderModel, pointSize);
unsigned int reservedSemanticIndex = getMaxSemanticIndex();
BuiltinInfo *builtins = &mBuiltinInfo[shaderType];
if (hlsl4)
{
builtins->dxPosition.enableSystem("SV_Position");
}
else if (shaderType == SHADER_PIXEL)
{
builtins->dxPosition.enableSystem("VPOS");
}
else
{
builtins->dxPosition.enableSystem("POSITION");
}
if (position)
{
builtins->glPosition.enable(userSemantic, reservedSemanticIndex++);
}
if (fragCoord)
{
builtins->glFragCoord.enable(userSemantic, reservedSemanticIndex++);
}
if (pointCoord)
{
// SM3 reserves the TEXCOORD semantic for point sprite texcoords (gl_PointCoord)
// In D3D11 we manually compute gl_PointCoord in the GS.
if (hlsl4)
{
builtins->glPointCoord.enable(userSemantic, reservedSemanticIndex++);
}
else
{
builtins->glPointCoord.enable("TEXCOORD", 0);
}
}
// Special case: do not include PSIZE semantic in HLSL 3 pixel shaders
if (pointSize && (shaderType != SHADER_PIXEL || hlsl4))
{
builtins->glPointSize.enableSystem("PSIZE");
}
}
} // namespace rx } // namespace rx
...@@ -8,15 +8,22 @@ ...@@ -8,15 +8,22 @@
// for linking between shader stages. // for linking between shader stages.
// //
#ifndef LIBANGLE_RENDERER_D3D_VARYINGPACKING_H_ #ifndef LIBANGLE_RENDERER_D3D_HLSL_VARYINGPACKING_H_
#define LIBANGLE_RENDERER_D3D_VARYINGPACKING_H_ #define LIBANGLE_RENDERER_D3D_HLSL_VARYINGPACKING_H_
#include "libANGLE/renderer/d3d/RendererD3D.h" #include <GLSLANG/ShaderVars.h>
namespace rx #include "angle_gl.h"
#include "common/angleutils.h"
#include "libANGLE/renderer/d3d/hlsl/hlsl_utils.h"
namespace gl
{ {
class ProgramD3DMetadata; class InfoLog;
}
namespace rx
{
struct PackedVarying struct PackedVarying
{ {
PackedVarying(const sh::ShaderVariable &varyingIn, sh::InterpolationType interpolationIn) PackedVarying(const sh::ShaderVariable &varyingIn, sh::InterpolationType interpolationIn)
...@@ -125,8 +132,6 @@ class VaryingPacking final : angle::NonCopyable ...@@ -125,8 +132,6 @@ class VaryingPacking final : angle::NonCopyable
} }
unsigned int getRegisterCount() const; unsigned int getRegisterCount() const;
void enableBuiltins(ShaderType shaderType, const ProgramD3DMetadata &programMetadata);
struct BuiltinVarying final : angle::NonCopyable struct BuiltinVarying final : angle::NonCopyable
{ {
BuiltinVarying(); BuiltinVarying();
...@@ -151,6 +156,7 @@ class VaryingPacking final : angle::NonCopyable ...@@ -151,6 +156,7 @@ class VaryingPacking final : angle::NonCopyable
}; };
const BuiltinInfo &builtins(ShaderType shaderType) const { return mBuiltinInfo[shaderType]; } const BuiltinInfo &builtins(ShaderType shaderType) const { return mBuiltinInfo[shaderType]; }
BuiltinInfo &builtins(ShaderType shaderType) { return mBuiltinInfo[shaderType]; }
bool usesPointSize() const { return mBuiltinInfo[SHADER_VERTEX].glPointSize.enabled; } bool usesPointSize() const { return mBuiltinInfo[SHADER_VERTEX].glPointSize.enabled; }
...@@ -172,4 +178,4 @@ class VaryingPacking final : angle::NonCopyable ...@@ -172,4 +178,4 @@ class VaryingPacking final : angle::NonCopyable
} // namespace rx } // namespace rx
#endif // LIBANGLE_RENDERER_D3D_VARYINGPACKING_H_ #endif // LIBANGLE_RENDERER_D3D_HLSL_VARYINGPACKING_H_
//
// Copyright 2015 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.
//
// hlsl_utils: Helper functions for HLSL.
#ifndef LIBANGLE_RENDERER_D3D_HLSL_HLSL_UTILS_H_
#define LIBANGLE_RENDERER_D3D_HLSL_HLSL_UTILS_H_
#include <string>
namespace rx
{
enum ShaderType
{
SHADER_VERTEX,
SHADER_PIXEL,
SHADER_GEOMETRY,
SHADER_TYPE_MAX
};
inline std::string GetVaryingSemantic(int majorShaderModel, bool programUsesPointSize)
{
// SM3 reserves the TEXCOORD semantic for point sprite texcoords (gl_PointCoord)
// In D3D11 we manually compute gl_PointCoord in the GS.
return ((programUsesPointSize && majorShaderModel < 4) ? "COLOR" : "TEXCOORD");
}
} // namespace rx
#endif // LIBANGLE_RENDERER_D3D_HLSL_HLSL_UTILS_H_
...@@ -265,14 +265,18 @@ ...@@ -265,14 +265,18 @@
'libANGLE/renderer/d3d/TextureD3D.cpp', 'libANGLE/renderer/d3d/TextureD3D.cpp',
'libANGLE/renderer/d3d/TextureD3D.h', 'libANGLE/renderer/d3d/TextureD3D.h',
'libANGLE/renderer/d3d/TextureStorage.h', 'libANGLE/renderer/d3d/TextureStorage.h',
'libANGLE/renderer/d3d/VaryingPacking.cpp',
'libANGLE/renderer/d3d/VaryingPacking.h',
'libANGLE/renderer/d3d/VertexBuffer.cpp', 'libANGLE/renderer/d3d/VertexBuffer.cpp',
'libANGLE/renderer/d3d/VertexBuffer.h', 'libANGLE/renderer/d3d/VertexBuffer.h',
'libANGLE/renderer/d3d/VertexDataManager.cpp', 'libANGLE/renderer/d3d/VertexDataManager.cpp',
'libANGLE/renderer/d3d/VertexDataManager.h', 'libANGLE/renderer/d3d/VertexDataManager.h',
'libANGLE/renderer/d3d/WorkaroundsD3D.h', 'libANGLE/renderer/d3d/WorkaroundsD3D.h',
], ],
'libangle_d3d_hlsl_sources':
[
'libANGLE/renderer/d3d/hlsl/VaryingPacking.cpp',
'libANGLE/renderer/d3d/hlsl/VaryingPacking.h',
'libANGLE/renderer/d3d/hlsl/hlsl_utils.h',
],
'libangle_d3d9_sources': 'libangle_d3d9_sources':
[ [
'libANGLE/renderer/d3d/d3d9/Blit9.cpp', 'libANGLE/renderer/d3d/d3d9/Blit9.cpp',
...@@ -826,6 +830,7 @@ ...@@ -826,6 +830,7 @@
{ {
'sources': 'sources':
[ [
'<@(libangle_d3d_hlsl_sources)',
'<@(libangle_d3d_shared_sources)', '<@(libangle_d3d_shared_sources)',
], ],
}], }],
......
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