LumixEngine/src/renderer/renderer.h
Mikulas Florek dc259e54e5 refactor
2022-10-24 23:27:20 +02:00

124 lines
4.3 KiB
C++

#pragma once
#include "engine/allocator.h"
#include "engine/lumix.h"
#include "engine/plugin.h"
#include "gpu/gpu.h"
namespace Lumix {
struct RenderPlugin {
virtual void renderUI(struct Pipeline& pipeline) {}
virtual void renderOpaque(Pipeline& pipeline) {}
virtual void renderTransparent(Pipeline& pipeline) {}
};
struct LUMIX_RENDERER_API Renderer : IPlugin {
struct MemRef {
u32 size = 0;
void* data = nullptr;
bool own = false;
};
struct RenderJob {
RenderJob() {}
RenderJob(const RenderJob& rhs) = delete;
virtual ~RenderJob() {}
virtual void setup() = 0;
virtual void execute() = 0;
i64 profiler_link = 0;
};
struct TransientSlice {
gpu::BufferHandle buffer;
u32 offset;
u32 size;
u8* ptr;
};
enum {
MAX_SHADER_DEFINES = 32,
};
virtual void startCapture() = 0;
virtual void stopCapture() = 0;
virtual void frame() = 0;
virtual u32 frameNumber() const = 0;
virtual void waitForRender() = 0;
virtual void waitForCommandSetup() = 0;
virtual void waitCanSetup() = 0;
virtual void makeScreenshot(const struct Path& filename) = 0;
virtual u8 getShaderDefineIdx(const char* define) = 0;
virtual const char* getShaderDefine(int define_idx) const = 0;
virtual int getShaderDefinesCount() const = 0;
virtual gpu::ProgramHandle queueShaderCompile(struct Shader& shader, gpu::VertexDecl decl, u32 defines) = 0;
virtual struct FontManager& getFontManager() = 0;
virtual struct ResourceManager& getTextureManager() = 0;
virtual void addPlugin(RenderPlugin& plugin) = 0;
virtual void removePlugin(RenderPlugin& plugin) = 0;
virtual Span<RenderPlugin*> getPlugins() = 0;
virtual float getLODMultiplier() const = 0;
virtual void setLODMultiplier(float value) = 0;
virtual u32 createMaterialConstants(Span<const float> data) = 0;
virtual void destroyMaterialConstants(u32 id) = 0;
virtual gpu::BufferHandle getMaterialUniformBuffer() = 0;
virtual IAllocator& getAllocator() = 0;
virtual MemRef allocate(u32 size) = 0;
virtual MemRef copy(const void* data, u32 size) = 0 ;
virtual void free(const MemRef& memory) = 0;
virtual TransientSlice allocTransient(u32 size) = 0;
virtual TransientSlice allocUniform(u32 size) = 0;
virtual gpu::BufferHandle createBuffer(const MemRef& memory, gpu::BufferFlags flags) = 0;
virtual void destroy(gpu::BufferHandle buffer) = 0;
virtual void destroy(gpu::ProgramHandle program) = 0;
virtual gpu::TextureHandle createTexture(u32 w, u32 h, u32 depth, gpu::TextureFormat format, gpu::TextureFlags flags, const MemRef& memory, const char* debug_name) = 0;
virtual gpu::TextureHandle loadTexture(const gpu::TextureDesc& desc, const MemRef& image_data, gpu::TextureFlags flags, const char* debug_name) = 0;
virtual void copy(gpu::TextureHandle dst, gpu::TextureHandle src) = 0;
virtual void downscale(gpu::TextureHandle src, u32 src_w, u32 src_h, gpu::TextureHandle dst, u32 dst_w, u32 dst_h) = 0;
virtual void updateBuffer(gpu::BufferHandle buffer, const MemRef& memory) = 0;
virtual void updateTexture(gpu::TextureHandle handle, u32 slice, u32 x, u32 y, u32 w, u32 h, gpu::TextureFormat format, const MemRef& memory) = 0;
virtual void getTextureImage(gpu::TextureHandle texture, u32 w, u32 h, gpu::TextureFormat out_format, Span<u8> data) = 0;
virtual void destroy(gpu::TextureHandle tex) = 0;
virtual void queue(RenderJob& cmd, i64 profiler_link) = 0;
virtual void beginProfileBlock(const char* name, i64 link, bool stats = false) = 0;
virtual void endProfileBlock() = 0;
virtual void runInRenderThread(void* user_ptr, void (*fnc)(Renderer& renderer, void*)) = 0;
virtual u32 allocSortKey(struct Mesh* mesh) = 0;
virtual void freeSortKey(u32 key) = 0;
virtual u32 getMaxSortKey() const = 0;
virtual const Mesh** getSortKeyToMeshMap() const = 0;
virtual u8 getLayerIdx(const char* name) = 0;
virtual u8 getLayersCount() const = 0;
virtual const char* getLayerName(u8 layer) const = 0;
virtual struct Engine& getEngine() = 0;
template <typename T, typename... Args> T& createJob(Args&&... args) {
return *new (NewPlaceholder(), allocJob(sizeof(T), alignof(T))) T(static_cast<Args&&>(args)...);
}
template <typename T> void destroyJob(T& job) {
job.~T();
deallocJob(&job);
}
virtual struct LinearAllocator& getCurrentFrameAllocator() = 0;
protected:
virtual void* allocJob(u32 size, u32 align) = 0;
virtual void deallocJob(void* ptr) = 0;
};
} // namespace Lumix