Some actually useful metal changes???
This commit is contained in:
@@ -89,18 +89,23 @@ class IndexBuffer : public Gfx::IndexBuffer, public Buffer {
|
||||
};
|
||||
DEFINE_REF(IndexBuffer)
|
||||
DEFINE_REF(IndexBuffer)
|
||||
class UniformBuffer : public Gfx::UniformBuffer, public Buffer {
|
||||
// Metal Uniform Buffer is not a buffer, but just plain bytes
|
||||
class UniformBuffer : public Gfx::UniformBuffer {
|
||||
public:
|
||||
UniformBuffer(PGraphics graphics, const UniformBufferCreateInfo& createInfo);
|
||||
virtual ~UniformBuffer();
|
||||
virtual void updateContents(uint64 offset, uint64 size, void* data) override;
|
||||
virtual void rotateBuffer(uint64 size) override;
|
||||
|
||||
void* getContents() const { return contents.data(); }
|
||||
size_t getSize() const { return contents.size(); }
|
||||
|
||||
protected:
|
||||
// Inherited via QueueOwnedResource
|
||||
virtual void executeOwnershipBarrier(Gfx::QueueType newOwner) override;
|
||||
virtual void executePipelineBarrier(Gfx::SeAccessFlags srcAccess, Gfx::SePipelineStageFlags srcStage, Gfx::SeAccessFlags dstAccess,
|
||||
Gfx::SePipelineStageFlags dstStage) override;
|
||||
private:
|
||||
Array<uint8> contents;
|
||||
};
|
||||
DEFINE_REF(UniformBuffer)
|
||||
class ShaderBuffer : public Gfx::ShaderBuffer, public Buffer {
|
||||
|
||||
@@ -164,36 +164,38 @@ void IndexBuffer::executePipelineBarrier(Gfx::SeAccessFlags srcAccess, Gfx::SePi
|
||||
}
|
||||
|
||||
UniformBuffer::UniformBuffer(PGraphics graphics, const UniformBufferCreateInfo& createInfo)
|
||||
: Gfx::UniformBuffer(graphics->getFamilyMapping(), createInfo),
|
||||
Metal::Buffer(graphics, createInfo.sourceData.size, Gfx::SE_BUFFER_USAGE_UNIFORM_BUFFER_BIT, createInfo.sourceData.owner,
|
||||
createInfo.dynamic, createInfo.name) {
|
||||
: Gfx::UniformBuffer(graphics->getFamilyMapping(), createInfo)
|
||||
, contents(createInfo.sourceData.size) {
|
||||
if (createInfo.sourceData.size > 0 && createInfo.sourceData.data != nullptr) {
|
||||
getAlloc()->updateContents(createInfo.sourceData.offset, createInfo.sourceData.size, createInfo.sourceData.data);
|
||||
std::memcpy(contents.data(), createInfo.sourceData.data, createInfo.sourceData.size);
|
||||
}
|
||||
}
|
||||
|
||||
UniformBuffer::~UniformBuffer() {}
|
||||
|
||||
void UniformBuffer::rotateBuffer(uint64 size) { Metal::Buffer::rotateBuffer(size); }
|
||||
void UniformBuffer::rotateBuffer(uint64 size) {
|
||||
contents.clear();
|
||||
contents.resize(size);
|
||||
}
|
||||
|
||||
void UniformBuffer::updateContents(uint64 offset, uint64 size, void* data) {
|
||||
if (size > 0 && data != nullptr) {
|
||||
Metal::Buffer::rotateBuffer(size);
|
||||
getAlloc()->updateContents(offset, size, data);
|
||||
contents.resize(offset+size);
|
||||
std::memcpy(contents.data()+offset, data, size);
|
||||
}
|
||||
}
|
||||
|
||||
void UniformBuffer::executeOwnershipBarrier(Gfx::QueueType newOwner) { Metal::Buffer::transferOwnership(newOwner); }
|
||||
void UniformBuffer::executeOwnershipBarrier(Gfx::QueueType newOwner) { }
|
||||
|
||||
void UniformBuffer::executePipelineBarrier(Gfx::SeAccessFlags srcAccess, Gfx::SePipelineStageFlags srcStage, Gfx::SeAccessFlags dstAccess,
|
||||
Gfx::SePipelineStageFlags dstStage) {
|
||||
Metal::Buffer::pipelineBarrier(srcAccess, srcStage, dstAccess, dstStage);
|
||||
|
||||
}
|
||||
|
||||
ShaderBuffer::ShaderBuffer(PGraphics graphics, const ShaderBufferCreateInfo& createInfo)
|
||||
: Gfx::ShaderBuffer(graphics->getFamilyMapping(), createInfo),
|
||||
Seele::Metal::Buffer(graphics, createInfo.sourceData.size, Gfx::SE_BUFFER_USAGE_STORAGE_BUFFER_BIT, createInfo.sourceData.owner,
|
||||
createInfo.dynamic, createInfo.name, createInfo.createCleared, createInfo.clearValue) {}
|
||||
true, createInfo.name, createInfo.sourceData.data == nullptr, createInfo.clearValue) {}
|
||||
|
||||
ShaderBuffer::~ShaderBuffer() {}
|
||||
|
||||
|
||||
@@ -63,6 +63,7 @@ class RenderCommand : public Gfx::RenderCommand {
|
||||
virtual void bindIndexBuffer(Gfx::PIndexBuffer indexBuffer) override;
|
||||
virtual void pushConstants(Gfx::SeShaderStageFlags stage, uint32 offset, uint32 size, const void* data) override;
|
||||
virtual void draw(uint32 vertexCount, uint32 instanceCount, int32 firstVertex, uint32 firstInstance) override;
|
||||
virtual void drawIndirect(Gfx::PShaderBuffer buffer, uint64 offset, uint32 drawCount, uint32 stride);
|
||||
virtual void drawIndexed(uint32 indexCount, uint32 instanceCount, int32 firstIndex, uint32 vertexOffset, uint32 firstInstance) override;
|
||||
virtual void drawMesh(uint32 groupX, uint32 groupY, uint32 groupZ) override;
|
||||
virtual void drawMeshIndirect(Gfx::PShaderBuffer buffer, uint64 offset, uint32 drawCount, uint32 stride) override;
|
||||
@@ -86,6 +87,7 @@ class ComputeCommand : public Gfx::ComputeCommand {
|
||||
virtual void bindDescriptor(const Array<Gfx::PDescriptorSet>& sets) override;
|
||||
virtual void pushConstants(Gfx::SeShaderStageFlags stage, uint32 offset, uint32 size, const void* data) override;
|
||||
virtual void dispatch(uint32 threadX, uint32 threadY, uint32 threadZ) override;
|
||||
virtual void dispatchIndirect(Gfx::PShaderBuffer buffer, uint32 offset) override;
|
||||
|
||||
private:
|
||||
PComputePipeline boundPipeline;
|
||||
|
||||
@@ -127,11 +127,14 @@ void RenderCommand::draw(uint32 vertexCount, uint32 instanceCount, int32 firstVe
|
||||
encoder->drawPrimitives(boundPipeline->getPrimitive(), firstVertex, vertexCount, instanceCount, firstInstance);
|
||||
}
|
||||
|
||||
void RenderCommand::drawIndirect(Gfx::PShaderBuffer buffer, uint64 offset, uint32 drawCount, uint32 stride) {
|
||||
encoder->drawPrimitives(MTL::PrimitiveTypeTriangle, buffer.cast<ShaderBuffer>()->getHandle(), offset);
|
||||
}
|
||||
|
||||
void RenderCommand::drawIndexed(uint32 indexCount, uint32 instanceCount, int32 firstIndex, uint32 vertexOffset, uint32 firstInstance) {
|
||||
encoder->drawIndexedPrimitives(boundPipeline->getPrimitive(), indexCount, cast(boundIndexBuffer->getIndexType()),
|
||||
boundIndexBuffer->getHandle(), firstIndex, instanceCount, vertexOffset, firstInstance);
|
||||
}
|
||||
|
||||
void RenderCommand::drawMesh(uint32 groupX, uint32 groupY, uint32 groupZ) {
|
||||
encoder->drawMeshThreadgroups(MTL::Size(groupX, groupY, groupZ), MTL::Size(128, 1, 1), MTL::Size(32, 1, 1));
|
||||
}
|
||||
@@ -184,6 +187,10 @@ void ComputeCommand::dispatch(uint32 threadX, uint32 threadY, uint32 threadZ) {
|
||||
encoder->dispatchThreadgroups(MTL::Size(threadX, threadY, threadZ), MTL::Size(32, 32, 1));
|
||||
}
|
||||
|
||||
void ComputeCommand::dispatchIndirect(Gfx::PShaderBuffer buffer, uint32 offset){
|
||||
encoder->dispatchThreadgroups(buffer.cast<ShaderBuffer>()->getHandle(), offset, MTL::Size(32, 32, 1));
|
||||
}
|
||||
|
||||
CommandQueue::CommandQueue(PGraphics graphics) : graphics(graphics) {
|
||||
queue = graphics->getDevice()->newCommandQueue();
|
||||
MTL::CommandBufferDescriptor* descriptor = MTL::CommandBufferDescriptor::alloc()->init();
|
||||
|
||||
@@ -19,10 +19,15 @@ class DescriptorLayout : public Gfx::DescriptorLayout {
|
||||
virtual ~DescriptorLayout();
|
||||
virtual void create() override;
|
||||
MTL::ArgumentEncoder* createEncoder();
|
||||
|
||||
uint32 getFlattenedIndex(uint32 binding, uint32 arrayIndex) const { return flattenMap.at(flattenIndex(binding, arrayIndex)); }
|
||||
constexpr uint32 getTotalBindingCount() const { return flattenedBindingCount; }
|
||||
|
||||
private:
|
||||
constexpr uint64 flattenIndex(uint32 binding, uint32 arrayIndex) const { return uint64(arrayIndex) << 32 | binding; }
|
||||
PGraphics graphics;
|
||||
NS::Array* arguments;
|
||||
Map<uint64, uint32> flattenMap;
|
||||
uint32 flattenedBindingCount = 0;
|
||||
};
|
||||
DEFINE_REF(DescriptorLayout)
|
||||
|
||||
@@ -41,21 +46,21 @@ class DescriptorPool : public Gfx::DescriptorPool {
|
||||
Array<ODescriptorSet> allocatedSets;
|
||||
};
|
||||
DEFINE_REF(DescriptorPool)
|
||||
|
||||
class DescriptorSet : public Gfx::DescriptorSet, public CommandBoundResource {
|
||||
public:
|
||||
DescriptorSet(PGraphics graphics, PDescriptorPool owner);
|
||||
virtual ~DescriptorSet();
|
||||
virtual void writeChanges() override;
|
||||
virtual void updateBuffer(uint32 binding, Gfx::PUniformBuffer uniformBuffer) override;
|
||||
virtual void updateBuffer(uint32 binding, Gfx::PShaderBuffer uniformBuffer) override;
|
||||
virtual void updateBuffer(uint32 binding, Gfx::PIndexBuffer uniformBuffer) override;
|
||||
virtual void updateSampler(uint32 binding, Gfx::PSampler samplerState) override;
|
||||
virtual void updateTexture(uint32 binding, Gfx::PTexture texture, Gfx::PSampler sampler = nullptr) override;
|
||||
virtual void updateTextureArray(uint32 binding, Array<Gfx::PTexture2D> texture) override;
|
||||
virtual void updateSamplerArray(uint32 binding, Array<Gfx::PSampler> samplers) override;
|
||||
virtual void updateAccelerationStructure(uint32 binding, Gfx::PTopLevelAS as) override;
|
||||
|
||||
virtual void updateBuffer(uint32 binding, uint32 index, Gfx::PUniformBuffer uniformBuffer) override;
|
||||
virtual void updateBuffer(uint32 binding, uint32 index, Gfx::PShaderBuffer uniformBuffer) override;
|
||||
virtual void updateBuffer(uint32 binding, uint32 index, Gfx::PVertexBuffer uniformBuffer) override;
|
||||
virtual void updateBuffer(uint32 binding, uint32 index, Gfx::PIndexBuffer uniformBuffer) override;
|
||||
virtual void updateSampler(uint32 binding, uint32 index, Gfx::PSampler samplerState) override;
|
||||
virtual void updateTexture(uint32 binding, uint32 index, Gfx::PTexture2D texture) override;
|
||||
virtual void updateTexture(uint32 binding, uint32 index, Gfx::PTexture3D texture) override;
|
||||
virtual void updateTexture(uint32 binding, uint32 index, Gfx::PTextureCube texture) override;
|
||||
virtual void updateAccelerationStructure(uint32 binding, uint32 index, Gfx::PTopLevelAS as) override;
|
||||
|
||||
constexpr const Array<MTL::Resource*>& getBoundResources() const { return boundResources; }
|
||||
|
||||
MTL::Buffer* getArgumentBuffer() const { return argumentBuffer; }
|
||||
|
||||
@@ -32,9 +32,10 @@ void DescriptorLayout::create() {
|
||||
pool = new DescriptorPool(graphics, this);
|
||||
hash = CRC::Calculate(descriptorBindings.data(), sizeof(Gfx::DescriptorBinding) * descriptorBindings.size(), CRC::CRC_32());
|
||||
MTL::ArgumentDescriptor** objects = new MTL::ArgumentDescriptor*[descriptorBindings.size()];
|
||||
flattenedBindingCount = 0;
|
||||
for (uint32 i = 0; i < descriptorBindings.size(); ++i) {
|
||||
objects[i] = MTL::ArgumentDescriptor::alloc()->init();
|
||||
objects[i]->setIndex(i);
|
||||
objects[i]->setIndex(flattenedBindingCount);
|
||||
objects[i]->setAccess(cast(descriptorBindings[i].access));
|
||||
objects[i]->setArrayLength(descriptorBindings[i].descriptorCount);
|
||||
MTL::DataType dataType;
|
||||
@@ -47,13 +48,16 @@ void DescriptorLayout::create() {
|
||||
case Gfx::SE_DESCRIPTOR_TYPE_INPUT_ATTACHMENT:
|
||||
dataType = MTL::DataTypeTexture;
|
||||
break;
|
||||
case Gfx::SE_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
|
||||
case Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER:
|
||||
case Gfx::SE_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
|
||||
case Gfx::SE_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC:
|
||||
case Gfx::SE_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK:
|
||||
dataType = MTL::DataTypePointer;
|
||||
break;
|
||||
case Gfx::SE_DESCRIPTOR_TYPE_UNIFORM_BUFFER:
|
||||
case Gfx::SE_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC:
|
||||
case Gfx::SE_DESCRIPTOR_TYPE_INLINE_UNIFORM_BLOCK:
|
||||
dataType = MTL::DataTypeChar;
|
||||
objects[i]->setArrayLength(descriptorBindings[i].uniformLength);
|
||||
break;
|
||||
case Gfx::SE_DESCRIPTOR_TYPE_SAMPLER:
|
||||
dataType = MTL::DataTypeSampler;
|
||||
break;
|
||||
@@ -89,6 +93,9 @@ void DescriptorLayout::create() {
|
||||
break;
|
||||
}
|
||||
objects[i]->setTextureType(textureType);
|
||||
for(uint32 j = 0; j < descriptorBindings[i].descriptorCount; ++j) {
|
||||
flattenMap[flattenIndex(i, j)] = flattenedBindingCount++;
|
||||
}
|
||||
}
|
||||
arguments = NS::Array::array((NS::Object**)objects, descriptorBindings.size());
|
||||
}
|
||||
@@ -119,49 +126,71 @@ DescriptorSet::DescriptorSet(PGraphics graphics, PDescriptorPool owner)
|
||||
: Gfx::DescriptorSet(owner->getLayout()), CommandBoundResource(graphics), graphics(graphics), owner(owner) {
|
||||
encoder = owner->getLayout()->createEncoder();
|
||||
argumentBuffer = graphics->getDevice()->newBuffer(encoder->encodedLength(), 0);
|
||||
std::cout << owner->getLayout()->getName() << ": " << encoder->encodedLength() << std::endl;
|
||||
encoder->setArgumentBuffer(argumentBuffer, 0);
|
||||
boundResources.resize(owner->getLayout()->getBindings().size());
|
||||
boundResources.resize(owner->getLayout()->getTotalBindingCount());
|
||||
}
|
||||
|
||||
DescriptorSet::~DescriptorSet() {}
|
||||
|
||||
void DescriptorSet::writeChanges() {}
|
||||
|
||||
void DescriptorSet::updateBuffer(uint32 binding, Gfx::PUniformBuffer uniformBuffer) {
|
||||
void DescriptorSet::updateBuffer(uint32 binding, uint32 index, Gfx::PUniformBuffer uniformBuffer) {
|
||||
uint32 flattenedIndex = owner->getLayout()->getFlattenedIndex(binding, index);
|
||||
PUniformBuffer buffer = uniformBuffer.cast<UniformBuffer>();
|
||||
encoder->setBuffer(buffer->getHandle(), 0, binding);
|
||||
boundResources[binding] = buffer->getHandle();
|
||||
std::memcpy(encoder->constantData(flattenedIndex), buffer->getContents(), buffer->getSize());
|
||||
boundResources[flattenedIndex] = nullptr;
|
||||
}
|
||||
|
||||
void DescriptorSet::updateBuffer(uint32 binding, Gfx::PShaderBuffer uniformBuffer) {
|
||||
void DescriptorSet::updateBuffer(uint32 binding, uint32 index, Gfx::PShaderBuffer uniformBuffer) {
|
||||
uint32 flattenedIndex = owner->getLayout()->getFlattenedIndex(binding, index);
|
||||
PShaderBuffer buffer = uniformBuffer.cast<ShaderBuffer>();
|
||||
encoder->setBuffer(buffer->getHandle(), 0, binding);
|
||||
boundResources[binding] = buffer->getHandle();
|
||||
encoder->setBuffer(buffer->getHandle(), 0, flattenedIndex);
|
||||
boundResources[flattenedIndex] = buffer->getHandle();
|
||||
}
|
||||
|
||||
void DescriptorSet::updateBuffer(uint32 binding, Gfx::PIndexBuffer uniformBuffer) {
|
||||
void DescriptorSet::updateBuffer(uint32 binding, uint32 index, Gfx::PVertexBuffer uniformBuffer) {
|
||||
uint32 flattenedIndex = owner->getLayout()->getFlattenedIndex(binding, index);
|
||||
PVertexBuffer buffer = uniformBuffer.cast<VertexBuffer>();
|
||||
encoder->setBuffer(buffer->getHandle(), 0, flattenedIndex);
|
||||
boundResources[flattenedIndex] = buffer->getHandle();
|
||||
}
|
||||
void DescriptorSet::updateBuffer(uint32 binding, uint32 index, Gfx::PIndexBuffer uniformBuffer) {
|
||||
uint32 flattenedIndex = owner->getLayout()->getFlattenedIndex(binding, index);
|
||||
PIndexBuffer buffer = uniformBuffer.cast<IndexBuffer>();
|
||||
encoder->setBuffer(buffer->getHandle(), 0, binding);
|
||||
boundResources[binding] = buffer->getHandle();
|
||||
encoder->setBuffer(buffer->getHandle(), 0, flattenedIndex);
|
||||
boundResources[flattenedIndex] = buffer->getHandle();
|
||||
}
|
||||
|
||||
void DescriptorSet::updateSampler(uint32 binding, Gfx::PSampler samplerState) {
|
||||
void DescriptorSet::updateSampler(uint32 binding, uint32 index, Gfx::PSampler samplerState) {
|
||||
uint32 flattenedIndex = owner->getLayout()->getFlattenedIndex(binding, index);
|
||||
PSampler sampler = samplerState.cast<Sampler>();
|
||||
encoder->setSamplerState(sampler->getHandle(), binding);
|
||||
boundResources[binding] = nullptr; // Samplers are not resources??????
|
||||
encoder->setSamplerState(sampler->getHandle(), flattenedIndex);
|
||||
boundResources[flattenedIndex] = nullptr; // Samplers are not resources??????
|
||||
}
|
||||
|
||||
void DescriptorSet::updateTexture(uint32 binding, Gfx::PTexture texture, Gfx::PSampler sampler) {
|
||||
PTextureBase base = texture.cast<TextureBase>();
|
||||
encoder->setTexture(base->getHandle()->texture, binding);
|
||||
boundResources[binding] = base->getHandle()->texture;
|
||||
void DescriptorSet::updateTexture(uint32 binding, uint32 index, Gfx::PTexture2D texture) {
|
||||
uint32 flattenedIndex = owner->getLayout()->getFlattenedIndex(binding, index);
|
||||
PTextureBase tex = texture.cast<TextureBase>();
|
||||
encoder->setTexture(tex->getImage(), flattenedIndex);
|
||||
boundResources[flattenedIndex] = tex->getImage();
|
||||
}
|
||||
|
||||
void DescriptorSet::updateTextureArray(uint32 binding, Array<Gfx::PTexture2D> texture) { assert(false && "TODO"); }
|
||||
void DescriptorSet::updateTexture(uint32 binding, uint32 index, Gfx::PTexture3D texture) {
|
||||
uint32 flattenedIndex = owner->getLayout()->getFlattenedIndex(binding, index);
|
||||
PTextureBase tex = texture.cast<TextureBase>();
|
||||
encoder->setTexture(tex->getImage(), flattenedIndex);
|
||||
boundResources[flattenedIndex] = tex->getImage();
|
||||
}
|
||||
|
||||
void DescriptorSet::updateSamplerArray(uint32 binding, Array<Gfx::PSampler> samplers) { assert(false && "TODO"); }
|
||||
void DescriptorSet::updateTexture(uint32 binding, uint32 index, Gfx::PTextureCube texture) {
|
||||
uint32 flattenedIndex = owner->getLayout()->getFlattenedIndex(binding, index);
|
||||
PTextureBase tex = texture.cast<TextureBase>();
|
||||
encoder->setTexture(tex->getImage(), flattenedIndex);
|
||||
boundResources[flattenedIndex] = tex->getImage();
|
||||
}
|
||||
|
||||
void DescriptorSet::updateAccelerationStructure(uint32 binding, Gfx::PTopLevelAS as) { assert(false && "TODO"); }
|
||||
void DescriptorSet::updateAccelerationStructure(uint32 binding, uint32 index, Gfx::PTopLevelAS as) { assert(false && "TODO"); }
|
||||
|
||||
PipelineLayout::PipelineLayout(PGraphics graphics, const std::string& name, Gfx::PPipelineLayout baseLayout)
|
||||
: Gfx::PipelineLayout(name, baseLayout), graphics(graphics) {}
|
||||
|
||||
@@ -58,8 +58,13 @@ class Graphics : public Gfx::Graphics {
|
||||
virtual Gfx::OPipelineStatisticsQuery createPipelineStatisticsQuery(const std::string& name = "") override;
|
||||
virtual Gfx::OTimestampQuery createTimestampQuery(uint64 numTimestamps, const std::string& name = "") override;
|
||||
|
||||
virtual void beginDebugRegion(const std::string& name) override;
|
||||
virtual void endDebugRegion() override;
|
||||
|
||||
virtual void resolveTexture(Gfx::PTexture source, Gfx::PTexture destination) override;
|
||||
virtual void copyTexture(Gfx::PTexture src, Gfx::PTexture dst) override;
|
||||
|
||||
virtual void copyBuffer(Gfx::PShaderBuffer src, Gfx::PShaderBuffer dst) override;
|
||||
|
||||
// Ray Tracing
|
||||
virtual Gfx::OBottomLevelAS createBottomLevelAccelerationStructure(const Gfx::BottomLevelASCreateInfo& createInfo) override;
|
||||
|
||||
@@ -143,10 +143,23 @@ Gfx::OTimestampQuery Graphics::createTimestampQuery(uint64 numTimestamps, const
|
||||
return new TimestampQuery(this, name, numTimestamps);
|
||||
}
|
||||
|
||||
void Graphics::beginDebugRegion(const std::string& name) {
|
||||
queue->getCommands()->getHandle()->pushDebugGroup(NS::String::string(name.c_str(), NS::ASCIIStringEncoding));
|
||||
}
|
||||
|
||||
void Graphics::endDebugRegion() {
|
||||
queue->getCommands()->getHandle()->popDebugGroup();
|
||||
}
|
||||
|
||||
void Graphics::resolveTexture(Gfx::PTexture, Gfx::PTexture) {}
|
||||
|
||||
void Graphics::copyTexture(Gfx::PTexture, Gfx::PTexture) {}
|
||||
|
||||
void Graphics::copyBuffer(Gfx::PShaderBuffer src, Gfx::PShaderBuffer dst)
|
||||
{
|
||||
// TODO blit commands
|
||||
}
|
||||
|
||||
// Ray Tracing
|
||||
Gfx::OBottomLevelAS Graphics::createBottomLevelAccelerationStructure(const Gfx::BottomLevelASCreateInfo& createInfo) { return nullptr; }
|
||||
|
||||
|
||||
Reference in New Issue
Block a user