Skip to content

Commit

Permalink
Plumb PipelineLayouts down to SpirvRoutine
Browse files Browse the repository at this point in the history
This initializes arrays to hold the descriptor sets in the routine. Nothing uses this yet.

Bug: b/126330097
Change-Id: If052d0b93e62e4f32e88ed02f9bc21f4203587f5
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/25553
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Tested-by: Ben Clayton <bclayton@google.com>
  • Loading branch information
ben-clayton committed Mar 6, 2019
1 parent 2c25b14 commit 76e9bc0
Show file tree
Hide file tree
Showing 19 changed files with 108 additions and 16 deletions.
2 changes: 2 additions & 0 deletions src/Device/Context.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -218,6 +218,8 @@ namespace sw
colorWriteMask[i] = 0x0000000F;
}

pipelineLayout = nullptr;

pixelShader = nullptr;
vertexShader = nullptr;

Expand Down
5 changes: 4 additions & 1 deletion src/Device/Context.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,8 @@
namespace vk
{
class ImageView;
};
class PipelineLayout;
} // namespace vk

namespace sw
{
Expand Down Expand Up @@ -198,6 +199,8 @@ namespace sw
vk::ImageView *stencilBuffer;
unsigned int stencilBufferLayer;

vk::PipelineLayout const *pipelineLayout;

// Shaders
const SpirvShader *pixelShader;
const SpirvShader *vertexShader;
Expand Down
2 changes: 1 addition & 1 deletion src/Device/PixelProcessor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -449,7 +449,7 @@ namespace sw

if(!routine)
{
QuadRasterizer *generator = new PixelProgram(state, context->pixelShader);
QuadRasterizer *generator = new PixelProgram(state, context->pipelineLayout, context->pixelShader);
generator->generate();
routine = (*generator)("PixelRoutine_%0.8X", state.shaderID);
delete generator;
Expand Down
2 changes: 1 addition & 1 deletion src/Device/VertexProcessor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,7 @@ namespace sw

if(!routine) // Create one
{
VertexRoutine *generator = new VertexProgram(state, context->vertexShader);
VertexRoutine *generator = new VertexProgram(state, context->pipelineLayout, context->vertexShader);
generator->generate();
routine = (*generator)("VertexRoutine_%0.8X", state.shaderID);
delete generator;
Expand Down
7 changes: 5 additions & 2 deletions src/Pipeline/PixelProgram.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,11 @@ namespace sw
class PixelProgram : public PixelRoutine
{
public:
PixelProgram(const PixelProcessor::State &state, SpirvShader const *spirvShader) :
PixelRoutine(state, spirvShader)
PixelProgram(
const PixelProcessor::State &state,
vk::PipelineLayout const *pipelineLayout,
SpirvShader const *spirvShader) :
PixelRoutine(state, pipelineLayout, spirvShader)
{
}

Expand Down
8 changes: 6 additions & 2 deletions src/Pipeline/PixelRoutine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,12 @@ namespace sw
extern bool exactColorRounding;
extern bool forceClearRegisters;

PixelRoutine::PixelRoutine(const PixelProcessor::State &state, SpirvShader const *spirvShader)
: QuadRasterizer(state, spirvShader) /* addressing */
PixelRoutine::PixelRoutine(
const PixelProcessor::State &state,
vk::PipelineLayout const *pipelineLayout,
SpirvShader const *spirvShader)
: QuadRasterizer(state, spirvShader),
routine(pipelineLayout)
{
spirvShader->emitProlog(&routine);

Expand Down
4 changes: 3 additions & 1 deletion src/Pipeline/PixelRoutine.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,9 @@ namespace sw
class PixelRoutine : public sw::QuadRasterizer, public ShaderCore
{
public:
PixelRoutine(const PixelProcessor::State &state, SpirvShader const *spirvShader);
PixelRoutine(const PixelProcessor::State &state,
vk::PipelineLayout const *pipelineLayout,
SpirvShader const *spirvShader);

virtual ~PixelRoutine();

Expand Down
7 changes: 7 additions & 0 deletions src/Pipeline/SpirvShader.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
#include "SpirvShader.hpp"
#include "System/Math.hpp"
#include "Vulkan/VkDebug.hpp"
#include "Vulkan/VkPipelineLayout.hpp"
#include "Device/Config.hpp"

namespace sw
Expand Down Expand Up @@ -1437,4 +1438,10 @@ namespace sw
}
}
}

SpirvRoutine::SpirvRoutine(vk::PipelineLayout const *pipelineLayout) :
pipelineLayout(pipelineLayout)
{
}

}
17 changes: 15 additions & 2 deletions src/Pipeline/SpirvShader.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,13 @@
#ifndef sw_SpirvShader_hpp
#define sw_SpirvShader_hpp

#include "System/Types.hpp"
#include "Vulkan/VkDebug.hpp"
#include "ShaderCore.hpp"
#include "SpirvID.hpp"
#include "System/Types.hpp"
#include "Vulkan/VkDebug.hpp"
#include "Vulkan/VkConfig.h"

#include <array>
#include <cstring>
#include <string>
#include <vector>
Expand All @@ -30,6 +32,11 @@
#include <spirv/unified1/spirv.hpp>
#include <Device/Config.hpp>

namespace vk
{
class PipelineLayout;
} // namespace vk

namespace sw
{
// Forward declarations.
Expand Down Expand Up @@ -412,15 +419,21 @@ namespace sw
class SpirvRoutine
{
public:
SpirvRoutine(vk::PipelineLayout const *pipelineLayout);

using Value = Array<SIMD::Float>;

vk::PipelineLayout const * const pipelineLayout;

std::unordered_map<SpirvShader::ObjectID, Value> lvalues;

std::unordered_map<SpirvShader::ObjectID, Intermediate> intermediates;

Value inputs = Value{MAX_INTERFACE_COMPONENTS};
Value outputs = Value{MAX_INTERFACE_COMPONENTS};

std::array<Pointer<Byte>, vk::MAX_BOUND_DESCRIPTOR_SETS> descriptorSets;

void createLvalue(SpirvShader::ObjectID id, uint32_t size)
{
lvalues.emplace(id, Value(size));
Expand Down
7 changes: 5 additions & 2 deletions src/Pipeline/VertexProgram.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,11 @@

namespace sw
{
VertexProgram::VertexProgram(const VertexProcessor::State &state, SpirvShader const *spirvShader)
: VertexRoutine(state, spirvShader)
VertexProgram::VertexProgram(
const VertexProcessor::State &state,
vk::PipelineLayout const *pipelineLayout,
SpirvShader const *spirvShader)
: VertexRoutine(state, pipelineLayout, spirvShader)
{
ifDepth = 0;
loopRepDepth = 0;
Expand Down
5 changes: 4 additions & 1 deletion src/Pipeline/VertexProgram.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,10 @@ namespace sw
class VertexProgram : public VertexRoutine, public ShaderCore
{
public:
VertexProgram(const VertexProcessor::State &state, SpirvShader const *spirvShader);
VertexProgram(
const VertexProcessor::State &state,
vk::PipelineLayout const *pipelineLayout,
SpirvShader const *spirvShader);

virtual ~VertexProgram();

Expand Down
8 changes: 6 additions & 2 deletions src/Pipeline/VertexRoutine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,12 @@

namespace sw
{
VertexRoutine::VertexRoutine(const VertexProcessor::State &state, SpirvShader const *spirvShader)
: state(state),
VertexRoutine::VertexRoutine(
const VertexProcessor::State &state,
vk::PipelineLayout const *pipelineLayout,
SpirvShader const *spirvShader)
: routine(pipelineLayout),
state(state),
spirvShader(spirvShader)
{
spirvShader->emitProlog(&routine);
Expand Down
10 changes: 9 additions & 1 deletion src/Pipeline/VertexRoutine.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@
#include "ShaderCore.hpp"
#include "SpirvShader.hpp"

namespace vk
{
class PipelineLayout;
} // namespace vk

namespace sw
{
class VertexRoutinePrototype : public Function<Void(Pointer<Byte>, Pointer<Byte>, Pointer<Byte>, Pointer<Byte>)>
Expand All @@ -38,7 +43,10 @@ namespace sw
class VertexRoutine : public VertexRoutinePrototype
{
public:
VertexRoutine(const VertexProcessor::State &state, SpirvShader const *spirvShader);
VertexRoutine(
const VertexProcessor::State &state,
vk::PipelineLayout const *pipelineLayout,
SpirvShader const *spirvShader);
virtual ~VertexRoutine();

void generate();
Expand Down
8 changes: 8 additions & 0 deletions src/Vulkan/VkDescriptorSetLayout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,8 @@
// limitations under the License.

#include "VkDescriptorSetLayout.hpp"
#include "System/Types.hpp"

#include <algorithm>
#include <cstring>

Expand Down Expand Up @@ -176,6 +178,12 @@ void DescriptorSetLayout::initialize(VkDescriptorSet vkDescriptorSet)
}
}

size_t DescriptorSetLayout::getBindingOffset(uint32_t binding) const
{
uint32_t index = getBindingIndex(binding);
return bindingOffsets[index] + OFFSET(DescriptorSet, data[0]);
}

uint8_t* DescriptorSetLayout::getOffsetPointer(VkDescriptorSet descriptorSet, uint32_t binding, uint32_t arrayElement, uint32_t count, size_t* typeSize) const
{
uint32_t index = getBindingIndex(binding);
Expand Down
1 change: 1 addition & 0 deletions src/Vulkan/VkDescriptorSetLayout.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ class DescriptorSetLayout : public Object<DescriptorSetLayout, VkDescriptorSetLa

void initialize(VkDescriptorSet descriptorSet);
size_t getSize() const;
size_t getBindingOffset(uint32_t binding) const;

private:
uint32_t getBindingIndex(uint32_t binding) const;
Expand Down
8 changes: 8 additions & 0 deletions src/Vulkan/VkPipeline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
// limitations under the License.

#include "VkPipeline.hpp"
#include "VkPipelineLayout.hpp"
#include "VkShaderModule.hpp"
#include "Pipeline/SpirvShader.hpp"

Expand Down Expand Up @@ -191,7 +192,10 @@ uint32_t getNumberOfChannels(VkFormat format)
namespace vk
{

Pipeline::Pipeline(PipelineLayout const *layout) : layout(layout) {}

GraphicsPipeline::GraphicsPipeline(const VkGraphicsPipelineCreateInfo* pCreateInfo, void* mem)
: Pipeline(Cast(pCreateInfo->layout))
{
if((pCreateInfo->flags != 0) ||
(pCreateInfo->stageCount != 2) ||
Expand Down Expand Up @@ -230,6 +234,9 @@ GraphicsPipeline::GraphicsPipeline(const VkGraphicsPipelineCreateInfo* pCreateIn
UNIMPLEMENTED();
}

// Context must always have a PipelineLayout set.
context.pipelineLayout = layout;

// Temporary in-binding-order representation of buffer strides, to be consumed below
// when considering attributes. TODO: unfuse buffers from attributes in backend, is old GL model.
uint32_t bufferStrides[MAX_VERTEX_INPUT_BINDINGS];
Expand Down Expand Up @@ -499,6 +506,7 @@ const sw::Color<float>& GraphicsPipeline::getBlendConstants() const
}

ComputePipeline::ComputePipeline(const VkComputePipelineCreateInfo* pCreateInfo, void* mem)
: Pipeline(Cast(pCreateInfo->layout))
{
}

Expand Down
9 changes: 9 additions & 0 deletions src/Vulkan/VkPipeline.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,13 @@ namespace sw { class SpirvShader; }
namespace vk
{

class PipelineLayout;

class Pipeline
{
public:
Pipeline(PipelineLayout const *layout);

operator VkPipeline()
{
return reinterpret_cast<VkPipeline>(this);
Expand All @@ -40,6 +44,11 @@ class Pipeline
#ifndef NDEBUG
virtual VkPipelineBindPoint bindPoint() const = 0;
#endif

PipelineLayout const * getLayout() const { return layout; }

protected:
PipelineLayout const *layout = nullptr;
};

class GraphicsPipeline : public Pipeline, public ObjectBase<GraphicsPipeline, VkPipeline>
Expand Down
11 changes: 11 additions & 0 deletions src/Vulkan/VkPipelineLayout.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,4 +44,15 @@ size_t PipelineLayout::ComputeRequiredAllocationSize(const VkPipelineLayoutCreat
(pCreateInfo->pushConstantRangeCount * sizeof(VkPushConstantRange));
}

size_t PipelineLayout::getNumDescriptorSets() const
{
return setLayoutCount;
}

size_t PipelineLayout::getBindingOffset(size_t descriptorSet, size_t binding) const
{
ASSERT(descriptorSet < setLayoutCount);
return setLayouts[descriptorSet]->getBindingOffset(binding);
}

} // namespace vk
3 changes: 3 additions & 0 deletions src/Vulkan/VkPipelineLayout.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@ class PipelineLayout : public Object<PipelineLayout, VkPipelineLayout>

static size_t ComputeRequiredAllocationSize(const VkPipelineLayoutCreateInfo* pCreateInfo);

size_t getNumDescriptorSets() const;
size_t getBindingOffset(size_t descriptorSet, size_t binding) const;

private:
uint32_t setLayoutCount = 0;
DescriptorSetLayout** setLayouts = nullptr;
Expand Down

0 comments on commit 76e9bc0

Please sign in to comment.