Files
Seele/src/Engine/Graphics/Resources.h
T
2025-04-17 08:36:47 +02:00

65 lines
1.9 KiB
C++

#pragma once
#include "Containers/Array.h"
#include "Enums.h"
#include "Math/Math.h"
#include "Initializer.h"
namespace Seele {
DECLARE_REF(Material)
namespace Gfx {
DECLARE_REF(DescriptorSet)
DECLARE_REF(Graphics)
DECLARE_REF(VertexBuffer)
DECLARE_REF(IndexBuffer)
DECLARE_REF(GraphicsPipeline)
DECLARE_REF(ComputePipeline)
class Sampler {
public:
Sampler(SamplerCreateInfo createInfo): samplerInfo(createInfo) {}
virtual ~Sampler() {}
SamplerCreateInfo samplerInfo;
};
DEFINE_REF(Sampler)
struct QueueFamilyMapping {
uint32 graphicsFamily;
uint32 computeFamily;
uint32 transferFamily;
uint32 getQueueTypeFamilyIndex(Gfx::QueueType type) const {
switch (type) {
case Gfx::QueueType::GRAPHICS:
return graphicsFamily;
case Gfx::QueueType::COMPUTE:
return computeFamily;
case Gfx::QueueType::TRANSFER:
return transferFamily;
default:
return 0x7fff;
}
}
bool needsTransfer(Gfx::QueueType src, Gfx::QueueType dst) const {
uint32 srcIndex = getQueueTypeFamilyIndex(src);
uint32 dstIndex = getQueueTypeFamilyIndex(dst);
return srcIndex != dstIndex;
}
};
class QueueOwnedResource {
public:
QueueOwnedResource(QueueFamilyMapping mapping);
virtual ~QueueOwnedResource();
// Preliminary checks to see if the barrier should be executed at all
void transferOwnership(QueueType newOwner);
void pipelineBarrier(SeAccessFlags srcAccess, SePipelineStageFlags srcStage, SeAccessFlags dstAccess, SePipelineStageFlags dstStage);
protected:
virtual void executeOwnershipBarrier(QueueType newOwner) = 0;
virtual void executePipelineBarrier(SeAccessFlags srcAccess, SePipelineStageFlags srcStage, SeAccessFlags dstAccess,
SePipelineStageFlags dstStage) = 0;
QueueFamilyMapping mapping;
};
DEFINE_REF(QueueOwnedResource)
} // namespace Gfx
} // namespace Seele