Metal: Remove vertexState in the parameter of TranslateToMSL

This patch removes the parameter "vertexState" from TranslateToMSL
and ShaderModule::CreateFunction as we have already been able to
get the vertex states from the RenderPipelineBase object.

BUG=dawn:529

Change-Id: I2971438bfd5e0f3fbea900e1f06c1b33349571da
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/64140
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
Commit-Queue: Jiawei Shao <jiawei.shao@intel.com>
This commit is contained in:
Jiawei Shao 2021-09-15 01:28:23 +00:00 committed by Dawn LUCI CQ
parent 020d69905e
commit 24cad6e2c3
5 changed files with 32 additions and 39 deletions

View File

@ -1035,30 +1035,36 @@ namespace dawn_native {
return std::move(output.program);
}
void AddVertexPullingTransformConfig(const VertexState& vertexState,
void AddVertexPullingTransformConfig(const RenderPipelineBase& renderPipeline,
const std::string& entryPoint,
BindGroupIndex pullingBufferBindingSet,
tint::transform::DataMap* transformInputs) {
tint::transform::VertexPulling::Config cfg;
cfg.entry_point_name = entryPoint;
cfg.pulling_group = static_cast<uint32_t>(pullingBufferBindingSet);
for (uint32_t i = 0; i < vertexState.bufferCount; ++i) {
const auto& vertexBuffer = vertexState.buffers[i];
tint::transform::VertexBufferLayoutDescriptor layout;
layout.array_stride = vertexBuffer.arrayStride;
layout.step_mode = ToTintVertexStepMode(vertexBuffer.stepMode);
for (uint32_t j = 0; j < vertexBuffer.attributeCount; ++j) {
const auto& attribute = vertexBuffer.attributes[j];
tint::transform::VertexAttributeDescriptor attr;
attr.format = ToTintVertexFormat(attribute.format);
attr.offset = attribute.offset;
attr.shader_location = attribute.shaderLocation;
layout.attributes.push_back(std::move(attr));
const auto& vertexBufferSlotUsed = renderPipeline.GetVertexBufferSlotsUsed();
cfg.vertex_state.resize(renderPipeline.GetVertexBufferCount());
for (uint8_t vertexBufferSlot = 0;
vertexBufferSlot < static_cast<uint8_t>(cfg.vertex_state.size()); ++vertexBufferSlot) {
if (vertexBufferSlotUsed[static_cast<VertexBufferSlot>(vertexBufferSlot)]) {
const auto& vertexBuffer =
renderPipeline.GetVertexBuffer(static_cast<VertexBufferSlot>(vertexBufferSlot));
cfg.vertex_state[vertexBufferSlot].array_stride = vertexBuffer.arrayStride;
cfg.vertex_state[vertexBufferSlot].step_mode =
ToTintVertexStepMode(vertexBuffer.stepMode);
}
cfg.vertex_state.push_back(std::move(layout));
}
for (VertexAttributeLocation location :
IterateBitSet(renderPipeline.GetAttributeLocationsUsed())) {
const auto& attribute = renderPipeline.GetAttribute(location);
tint::transform::VertexAttributeDescriptor attr;
attr.format = ToTintVertexFormat(attribute.format);
attr.offset = attribute.offset;
attr.shader_location = static_cast<uint32_t>(static_cast<uint8_t>(location));
ASSERT(vertexBufferSlotUsed[attribute.vertexBufferSlot]);
uint8_t vertexBufferSlot = static_cast<uint8_t>(attribute.vertexBufferSlot);
cfg.vertex_state[vertexBufferSlot].attributes.push_back(attr);
}
transformInputs->Add<tint::transform::VertexPulling::Config>(cfg);
}

View File

@ -110,7 +110,7 @@ namespace dawn_native {
OwnedCompilationMessages* messages);
/// Creates and adds the tint::transform::VertexPulling::Config to transformInputs.
void AddVertexPullingTransformConfig(const VertexState& vertexState,
void AddVertexPullingTransformConfig(const RenderPipelineBase& renderPipeline,
const std::string& entryPoint,
BindGroupIndex pullingBufferBindingSet,
tint::transform::DataMap* transformInputs);

View File

@ -341,17 +341,9 @@ namespace dawn_native { namespace metal {
ShaderModule* vertexModule = ToBackend(descriptor->vertex.module);
const char* vertexEntryPoint = descriptor->vertex.entryPoint;
ShaderModule::MetalFunctionData vertexData;
const VertexState* vertexStatePtr = &descriptor->vertex;
VertexState vertexState;
if (vertexStatePtr == nullptr) {
vertexState = {};
vertexStatePtr = &vertexState;
}
DAWN_TRY(vertexModule->CreateFunction(vertexEntryPoint, SingleShaderStage::Vertex,
ToBackend(GetLayout()), &vertexData, 0xFFFFFFFF, this,
vertexStatePtr));
ToBackend(GetLayout()), &vertexData, 0xFFFFFFFF,
this));
descriptorMTL.vertexFunction = vertexData.function.Get();
if (vertexData.needsStorageBufferLength) {

View File

@ -43,8 +43,7 @@ namespace dawn_native { namespace metal {
const PipelineLayout* layout,
MetalFunctionData* out,
uint32_t sampleMask = 0xFFFFFFFF,
const RenderPipeline* renderPipeline = nullptr,
const VertexState* vertexState = nullptr);
const RenderPipeline* renderPipeline = nullptr);
private:
ResultOrError<std::string> TranslateToMSL(const char* entryPointName,
@ -52,7 +51,6 @@ namespace dawn_native { namespace metal {
const PipelineLayout* layout,
uint32_t sampleMask,
const RenderPipeline* renderPipeline,
const VertexState* vertexState,
std::string* remappedEntryPointName,
bool* needsStorageBufferLength,
bool* hasInvariantAttribute);

View File

@ -49,7 +49,6 @@ namespace dawn_native { namespace metal {
const PipelineLayout* layout,
uint32_t sampleMask,
const RenderPipeline* renderPipeline,
const VertexState* vertexState,
std::string* remappedEntryPointName,
bool* needsStorageBufferLength,
bool* hasInvariantAttribute) {
@ -100,8 +99,8 @@ namespace dawn_native { namespace metal {
if (stage == SingleShaderStage::Vertex &&
GetDevice()->IsToggleEnabled(Toggle::MetalEnableVertexPulling)) {
transformManager.Add<tint::transform::VertexPulling>();
AddVertexPullingTransformConfig(*vertexState, entryPointName, kPullingBufferBindingSet,
&transformInputs);
AddVertexPullingTransformConfig(*renderPipeline, entryPointName,
kPullingBufferBindingSet, &transformInputs);
for (VertexBufferSlot slot :
IterateBitSet(renderPipeline->GetVertexBufferSlotsUsed())) {
@ -176,15 +175,13 @@ namespace dawn_native { namespace metal {
const PipelineLayout* layout,
ShaderModule::MetalFunctionData* out,
uint32_t sampleMask,
const RenderPipeline* renderPipeline,
const VertexState* vertexState) {
const RenderPipeline* renderPipeline) {
ASSERT(!IsError());
ASSERT(out);
// Vertex stages must specify a renderPipeline and vertexState
// Vertex stages must specify a renderPipeline
if (stage == SingleShaderStage::Vertex) {
ASSERT(renderPipeline != nullptr);
ASSERT(vertexState != nullptr);
}
std::string remappedEntryPointName;
@ -192,8 +189,8 @@ namespace dawn_native { namespace metal {
bool hasInvariantAttribute = false;
DAWN_TRY_ASSIGN(msl,
TranslateToMSL(entryPointName, stage, layout, sampleMask, renderPipeline,
vertexState, &remappedEntryPointName,
&out->needsStorageBufferLength, &hasInvariantAttribute));
&remappedEntryPointName, &out->needsStorageBufferLength,
&hasInvariantAttribute));
// Metal uses Clang to compile the shader as C++14. Disable everything in the -Wall
// category. -Wunused-variable in particular comes up a lot in generated code, and some