mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-12-06 07:12:28 +01:00
126 lines
3.4 KiB
C++
126 lines
3.4 KiB
C++
#pragma once
|
|
#include "Emu/RSX/GSRender.h"
|
|
#include "VKHelpers.h"
|
|
#include "VKTextureCache.h"
|
|
#include "VKRenderTargets.h"
|
|
#include "VKFormats.h"
|
|
#include <Utilities\optional.hpp>
|
|
|
|
#define RSX_DEBUG 1
|
|
|
|
#include "VKProgramBuffer.h"
|
|
#include "../GCM.h"
|
|
|
|
#pragma comment(lib, "VKstatic.1.lib")
|
|
|
|
class VKGSRender : public GSRender
|
|
{
|
|
private:
|
|
VKFragmentProgram m_fragment_prog;
|
|
VKVertexProgram m_vertex_prog;
|
|
|
|
vk::glsl::program *m_program;
|
|
vk::context m_thread_context;
|
|
|
|
vk::vk_data_heap m_attrib_ring_info;
|
|
|
|
vk::texture_cache m_texture_cache;
|
|
rsx::vk_render_targets m_rtts;
|
|
|
|
vk::gpu_formats_support m_optimal_tiling_supported_formats;
|
|
vk::memory_type_mapping m_memory_type_mapping;
|
|
|
|
std::unique_ptr<vk::buffer> null_buffer;
|
|
std::unique_ptr<vk::buffer_view> null_buffer_view;
|
|
|
|
public:
|
|
//vk::fbo draw_fbo;
|
|
|
|
private:
|
|
VKProgramBuffer m_prog_buffer;
|
|
|
|
vk::render_device *m_device;
|
|
vk::swap_chain* m_swap_chain;
|
|
//buffer
|
|
|
|
vk::vk_data_heap m_uniform_buffer_ring_info;
|
|
vk::vk_data_heap m_index_buffer_ring_info;
|
|
vk::vk_data_heap m_texture_upload_buffer_ring_info;
|
|
|
|
//Vulkan internals
|
|
u32 m_current_present_image = 0xFFFF;
|
|
VkSemaphore m_present_semaphore = nullptr;
|
|
|
|
u32 m_current_sync_buffer_index = 0;
|
|
VkFence m_submit_fence = nullptr;
|
|
|
|
vk::command_pool m_command_buffer_pool;
|
|
vk::command_buffer m_command_buffer;
|
|
|
|
|
|
std::array<VkRenderPass, 120> m_render_passes;
|
|
VkDescriptorSetLayout descriptor_layouts;
|
|
VkDescriptorSet descriptor_sets;
|
|
VkPipelineLayout pipeline_layout;
|
|
vk::descriptor_pool descriptor_pool;
|
|
|
|
std::vector<std::unique_ptr<vk::buffer_view> > m_buffer_view_to_clean;
|
|
std::vector<std::unique_ptr<vk::framebuffer> > m_framebuffer_to_clean;
|
|
std::vector<std::unique_ptr<vk::sampler> > m_sampler_to_clean;
|
|
|
|
u32 m_client_width = 0;
|
|
u32 m_client_height = 0;
|
|
|
|
u32 m_draw_calls = 0;
|
|
u32 m_used_descriptors = 0;
|
|
u8 m_draw_buffers_count = 0;
|
|
|
|
public:
|
|
VKGSRender();
|
|
~VKGSRender();
|
|
|
|
private:
|
|
void clear_surface(u32 mask);
|
|
void close_and_submit_command_buffer(const std::vector<VkSemaphore> &semaphores, VkFence fence);
|
|
void open_command_buffer();
|
|
void sync_at_semaphore_release();
|
|
void prepare_rtts();
|
|
/// returns primitive topology, is_indexed, index_count, offset in index buffer, index type
|
|
std::tuple<VkPrimitiveTopology, u32, std::optional<std::tuple<VkDeviceSize, VkIndexType> > > upload_vertex_data();
|
|
|
|
void upload_vertex_buffers(u32 input_mask, u32 vertex_max_index);
|
|
|
|
/// returns number of vertex drawn
|
|
u32 upload_inlined_array();
|
|
|
|
/**
|
|
* Upload index (and expands it if primitive type is not natively supported).
|
|
* Returns min index, max index, index_count, and (offset_in_index_buffer, index_type)
|
|
*/
|
|
std::tuple<u32, u32, u32, std::tuple<VkDeviceSize, VkIndexType>> upload_index_buffer(const rsx::draw_clause &clause);
|
|
|
|
/**
|
|
* Creates and fills an index buffer emulating unsupported primitive type.
|
|
* Returns index_count and (offset_in_index_buffer, index_type)
|
|
*/
|
|
std::tuple<u32, std::tuple<VkDeviceSize, VkIndexType> > generate_emulating_index_buffer(const rsx::draw_clause &clause);
|
|
|
|
public:
|
|
bool load_program();
|
|
void init_buffers(bool skip_reading = false);
|
|
void read_buffers();
|
|
void write_buffers();
|
|
void set_viewport();
|
|
|
|
protected:
|
|
void begin() override;
|
|
void end() override;
|
|
|
|
void on_init_thread() override;
|
|
void on_exit() override;
|
|
bool do_method(u32 id, u32 arg) override;
|
|
void flip(int buffer) override;
|
|
|
|
bool on_access_violation(u32 address, bool is_writing) override;
|
|
};
|