Kyty/source/emulator/include/Emulator/Graphics/GraphicsRender.h

113 lines
4.6 KiB
C
Raw Normal View History

2021-12-01 09:29:27 +00:00
#ifndef EMULATOR_INCLUDE_EMULATOR_GRAPHICS_GRAPHICSRENDER_H_
#define EMULATOR_INCLUDE_EMULATOR_GRAPHICS_GRAPHICSRENDER_H_
#include "Kyty/Core/Common.h"
#include "Emulator/Common.h"
#include "Emulator/Kernel/EventQueue.h"
#ifdef KYTY_EMU_ENABLED
namespace Kyty::Libs::Graphics {
2022-04-01 05:42:43 +00:00
namespace HW {
2021-12-01 09:29:27 +00:00
class HardwareContext;
class UserConfig;
2022-04-01 05:42:43 +00:00
} // namespace HW
2021-12-29 08:09:27 +00:00
class CommandProcessor;
2021-12-01 09:29:27 +00:00
struct VideoOutVulkanImage;
struct DepthStencilVulkanImage;
struct TextureVulkanImage;
2022-02-20 10:04:12 +00:00
struct StorageTextureVulkanImage;
2022-02-14 01:58:44 +00:00
struct RenderTextureVulkanImage;
2021-12-01 09:29:27 +00:00
struct VulkanCommandPool;
struct VulkanBuffer;
struct VulkanFramebuffer;
struct RenderDepthInfo;
struct RenderColorInfo;
class CommandBuffer
{
public:
CommandBuffer() { Allocate(); }
virtual ~CommandBuffer() { Free(); }
2021-12-29 08:09:27 +00:00
void SetParent(CommandProcessor* parent) { m_parent = parent; }
2021-12-01 09:29:27 +00:00
KYTY_CLASS_NO_COPY(CommandBuffer);
[[nodiscard]] bool IsInvalid() const;
2022-03-21 09:23:27 +00:00
void Allocate();
void Free();
void Begin() const;
void End() const;
void Execute();
void ExecuteWithSemaphore();
void BeginRenderPass(VulkanFramebuffer* framebuffer, RenderColorInfo* color, RenderDepthInfo* depth) const;
void EndRenderPass() const;
void WaitForFence();
void WaitForFenceAndReset();
2021-12-01 09:29:27 +00:00
[[nodiscard]] uint32_t GetIndex() const { return m_index; }
VulkanCommandPool* GetPool() { return m_pool; }
[[nodiscard]] bool IsExecute() const { return m_execute; }
void SetQueue(int queue) { m_queue = queue; }
2021-12-29 08:09:27 +00:00
void CommandProcessorWait();
2021-12-01 09:29:27 +00:00
private:
VulkanCommandPool* m_pool = nullptr;
uint32_t m_index = static_cast<uint32_t>(-1);
int m_queue = -1;
bool m_execute = false;
2021-12-29 08:09:27 +00:00
CommandProcessor* m_parent = nullptr;
2021-12-01 09:29:27 +00:00
};
void GraphicsRenderInit();
void GraphicsRenderCreateContext();
2022-04-01 05:42:43 +00:00
void GraphicsRenderDrawIndex(CommandBuffer* buffer, HW::HardwareContext* ctx, HW::UserConfig* ucfg, uint32_t index_type_and_size,
2021-12-01 09:29:27 +00:00
uint32_t index_count, const void* index_addr, uint32_t flags, uint32_t type);
2022-04-01 05:42:43 +00:00
void GraphicsRenderDrawIndexAuto(CommandBuffer* buffer, HW::HardwareContext* ctx, HW::UserConfig* ucfg, uint32_t index_count,
uint32_t flags);
2021-12-01 09:29:27 +00:00
void GraphicsRenderWriteAtEndOfPipe(CommandBuffer* buffer, uint64_t* dst_gpu_addr, uint64_t value);
void GraphicsRenderWriteAtEndOfPipeClockCounter(CommandBuffer* buffer, uint64_t* dst_gpu_addr);
void GraphicsRenderWriteAtEndOfPipe(CommandBuffer* buffer, uint32_t* dst_gpu_addr, uint32_t value);
void GraphicsRenderWriteAtEndOfPipeGds(CommandBuffer* buffer, uint32_t* dst_gpu_addr, uint32_t dw_offset, uint32_t dw_num);
void GraphicsRenderWriteAtEndOfPipeWithInterruptWriteBackFlip(CommandBuffer* buffer, uint32_t* dst_gpu_addr, uint32_t value, int handle,
int index, int flip_mode, int64_t flip_arg);
2021-12-29 08:09:27 +00:00
void GraphicsRenderWriteAtEndOfPipeWithFlip(CommandBuffer* buffer, uint32_t* dst_gpu_addr, uint32_t value, int handle, int index,
int flip_mode, int64_t flip_arg);
2021-12-01 09:29:27 +00:00
void GraphicsRenderWriteAtEndOfPipeWithWriteBack(CommandBuffer* buffer, uint64_t* dst_gpu_addr, uint64_t value);
2021-12-29 08:09:27 +00:00
void GraphicsRenderWriteAtEndOfPipeWithInterruptWriteBack(CommandBuffer* buffer, uint64_t* dst_gpu_addr, uint64_t value);
2021-12-01 09:29:27 +00:00
void GraphicsRenderWriteAtEndOfPipeWithInterrupt(CommandBuffer* buffer, uint64_t* dst_gpu_addr, uint64_t value);
void GraphicsRenderWriteBack();
2022-04-01 05:42:43 +00:00
void GraphicsRenderDispatchDirect(CommandBuffer* buffer, HW::HardwareContext* ctx, uint32_t thread_group_x, uint32_t thread_group_y,
2021-12-01 09:29:27 +00:00
uint32_t thread_group_z, uint32_t mode);
void GraphicsRenderMemoryBarrier(CommandBuffer* buffer);
2022-02-14 01:58:44 +00:00
void GraphicsRenderRenderTextureBarrier(CommandBuffer* buffer, uint64_t vaddr, uint64_t size);
2022-03-21 09:23:27 +00:00
void GraphicsRenderMemoryFree(uint64_t vaddr, uint64_t size);
2021-12-01 09:29:27 +00:00
void DeleteFramebuffer(VideoOutVulkanImage* image);
void DeleteFramebuffer(DepthStencilVulkanImage* image);
2022-02-14 01:58:44 +00:00
void DeleteFramebuffer(RenderTextureVulkanImage* image);
2021-12-01 09:29:27 +00:00
void DeleteDescriptor(VulkanBuffer* buffer);
void DeleteDescriptor(TextureVulkanImage* image);
2022-02-20 10:04:12 +00:00
void DeleteDescriptor(StorageTextureVulkanImage* image);
2022-02-14 01:58:44 +00:00
void DeleteDescriptor(RenderTextureVulkanImage* image);
2021-12-01 09:29:27 +00:00
int GraphicsRenderAddEqEvent(LibKernel::EventQueue::KernelEqueue eq, int id, void* udata);
int GraphicsRenderDeleteEqEvent(LibKernel::EventQueue::KernelEqueue eq, int id);
void GraphicsRenderClearGds(uint64_t dw_offset, uint32_t dw_num, uint32_t clear_value);
void GraphicsRenderReadGds(uint32_t* dst, uint32_t dw_offset, uint32_t dw_size);
} // namespace Kyty::Libs::Graphics
#endif // KYTY_EMU_ENABLED
#endif /* EMULATOR_INCLUDE_EMULATOR_GRAPHICS_GRAPHICSRENDER_H_ */