-
-
Notifications
You must be signed in to change notification settings - Fork 1.9k
/
VKHelpers.h
137 lines (111 loc) · 4.16 KB
/
VKHelpers.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
#pragma once
#include "util/types.hpp"
#include <string>
#include <functional>
#include <vector>
#include <memory>
#include <unordered_map>
#include <variant>
#include <stack>
#include <deque>
#include "VulkanAPI.h"
#include "vkutils/chip_class.h"
#include "Utilities/geometry.h"
#include "Emu/RSX/Common/TextureUtils.h"
#include "Emu/RSX/rsx_utils.h"
#define OCCLUSION_MAX_POOL_SIZE DESCRIPTOR_MAX_DRAW_CALLS
namespace rsx
{
struct GCM_tile_reference;
}
namespace vk
{
// Forward declarations
struct buffer;
class command_buffer;
class data_heap;
struct fence;
class image;
class instance;
class render_device;
struct queue_submit_t;
enum runtime_state
{
uninterruptible = 1,
heap_dirty = 2,
heap_changed = 4,
};
struct image_readback_options_t
{
bool swap_bytes = false;
struct
{
u64 offset = 0;
u64 length = 0;
operator bool() const { return length != 0; }
} sync_region {};
};
const vk::render_device *get_current_renderer();
void set_current_renderer(const vk::render_device &device);
// Compatibility workarounds
bool emulate_primitive_restart(rsx::primitive_type type);
bool sanitize_fp_values();
bool fence_reset_disabled();
bool emulate_conditional_rendering();
VkFlags get_heap_compatible_buffer_types();
// Sync helpers around vkQueueSubmit
void acquire_global_submit_lock();
void release_global_submit_lock();
void queue_submit(const vk::queue_submit_t* packet);
template<class T>
T* get_compute_task();
void destroy_global_resources();
void reset_global_resources();
enum image_upload_options
{
upload_contents_async = 1,
initialize_image_layout = 2,
preserve_image_layout = 4,
source_is_gpu_resident = 8,
// meta-flags
upload_contents_inline = 0,
upload_heap_align_default = 0
};
void upload_image(const vk::command_buffer& cmd, vk::image* dst_image,
const std::vector<rsx::subresource_layout>& subresource_layout, int format, bool is_swizzled, u16 layer_count,
VkImageAspectFlags flags, vk::data_heap &upload_heap, u32 heap_align, rsx::flags32_t image_setup_flags);
std::pair<buffer*, u32> detile_memory_block(
const vk::command_buffer& cmd, const rsx::GCM_tile_reference& tiled_region, const utils::address_range& range,
u16 width, u16 height, u8 bpp);
// Other texture management helpers
void copy_image_to_buffer(const vk::command_buffer& cmd, const vk::image* src, const vk::buffer* dst, const VkBufferImageCopy& region, const image_readback_options_t& options = {});
void copy_buffer_to_image(const vk::command_buffer& cmd, const vk::buffer* src, const vk::image* dst, const VkBufferImageCopy& region);
u64 calculate_working_buffer_size(u64 base_size, VkImageAspectFlags aspect);
void copy_image_typeless(const command_buffer &cmd, image *src, image *dst, const areai& src_rect, const areai& dst_rect,
u32 mipmaps, VkImageAspectFlags src_transfer_mask = 0xFF, VkImageAspectFlags dst_transfer_mask = 0xFF);
void copy_image(const vk::command_buffer& cmd, vk::image* src, vk::image* dst,
const areai& src_rect, const areai& dst_rect, u32 mipmaps,
VkImageAspectFlags src_transfer_mask = 0xFF, VkImageAspectFlags dst_transfer_mask = 0xFF);
void copy_scaled_image(const vk::command_buffer& cmd, vk::image* src, vk::image* dst,
const areai& src_rect, const areai& dst_rect, u32 mipmaps,
bool compatible_formats, VkFilter filter = VK_FILTER_LINEAR);
std::pair<VkFormat, VkComponentMapping> get_compatible_surface_format(rsx::surface_color_format color_format);
// Runtime stuff
void raise_status_interrupt(runtime_state status);
void clear_status_interrupt(runtime_state status);
bool test_status_interrupt(runtime_state status);
void enter_uninterruptible();
void leave_uninterruptible();
bool is_uninterruptible();
void advance_completed_frame_counter();
void advance_frame_counter();
u64 get_current_frame_id();
u64 get_last_completed_frame_id();
// Handle unexpected submit with dangling occlusion query
// TODO: Move queries out of the renderer!
void do_query_cleanup(vk::command_buffer& cmd);
struct blitter
{
void scale_image(vk::command_buffer& cmd, vk::image* src, vk::image* dst, areai src_area, areai dst_area, bool interpolate, const rsx::typeless_xfer& xfer_info);
};
}