committed by
ameerj
43 changed files with 1003 additions and 3036 deletions
-
13src/shader_recompiler/CMakeLists.txt
-
2src/shader_recompiler/backend/spirv/emit_context.cpp
-
117src/shader_recompiler/backend/spirv/emit_spirv.cpp
-
419src/shader_recompiler/backend/spirv/emit_spirv.h
-
24src/shader_recompiler/backend/spirv/emit_spirv_bitwise_conversion.cpp
-
48src/shader_recompiler/backend/spirv/emit_spirv_composite.cpp
-
42src/shader_recompiler/backend/spirv/emit_spirv_context_get_set.cpp
-
10src/shader_recompiler/backend/spirv/emit_spirv_control_flow.cpp
-
92src/shader_recompiler/backend/spirv/emit_spirv_floating_point.cpp
-
60src/shader_recompiler/backend/spirv/emit_spirv_integer.cpp
-
40src/shader_recompiler/backend/spirv/emit_spirv_logical.cpp
-
56src/shader_recompiler/backend/spirv/emit_spirv_memory.cpp
-
8src/shader_recompiler/backend/spirv/emit_spirv_select.cpp
-
10src/shader_recompiler/backend/spirv/emit_spirv_undefined.cpp
-
6src/shader_recompiler/environment.h
-
6src/shader_recompiler/file_environment.cpp
-
4src/shader_recompiler/file_environment.h
-
2src/shader_recompiler/frontend/ir/basic_block.cpp
-
2src/shader_recompiler/frontend/ir/post_order.cpp
-
2src/shader_recompiler/frontend/maxwell/program.cpp
-
8src/shader_recompiler/frontend/maxwell/translate/impl/impl.cpp
-
1src/shader_recompiler/frontend/maxwell/translate/impl/impl.h
-
35src/shader_recompiler/frontend/maxwell/translate/impl/move_register.cpp
-
4src/shader_recompiler/frontend/maxwell/translate/impl/not_implemented.cpp
-
2src/shader_recompiler/main.cpp
-
13src/shader_recompiler/profile.h
-
27src/shader_recompiler/recompiler.cpp
-
18src/shader_recompiler/recompiler.h
-
6src/video_core/CMakeLists.txt
-
1src/video_core/engines/kepler_compute.h
-
2298src/video_core/engines/shader_bytecode.h
-
158src/video_core/engines/shader_header.h
-
140src/video_core/renderer_vulkan/vk_compute_pipeline.cpp
-
43src/video_core/renderer_vulkan/vk_compute_pipeline.h
-
6src/video_core/renderer_vulkan/vk_descriptor_pool.cpp
-
10src/video_core/renderer_vulkan/vk_descriptor_pool.h
-
36src/video_core/renderer_vulkan/vk_pipeline.h
-
190src/video_core/renderer_vulkan/vk_pipeline_cache.cpp
-
30src/video_core/renderer_vulkan/vk_pipeline_cache.h
-
23src/video_core/renderer_vulkan/vk_rasterizer.cpp
-
3src/video_core/renderer_vulkan/vk_rasterizer.h
-
12src/video_core/renderer_vulkan/vk_resource_pool.cpp
-
12src/video_core/renderer_vulkan/vk_resource_pool.h
@ -0,0 +1,13 @@ |
|||||
|
// Copyright 2021 yuzu Emulator Project |
||||
|
// Licensed under GPLv2 or any later version |
||||
|
// Refer to the license.txt file included. |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
namespace Shader { |
||||
|
|
||||
|
struct Profile { |
||||
|
bool unified_descriptor_binding; |
||||
|
}; |
||||
|
|
||||
|
} // namespace Shader |
||||
@ -0,0 +1,27 @@ |
|||||
|
// Copyright 2021 yuzu Emulator Project
|
||||
|
// Licensed under GPLv2 or any later version
|
||||
|
// Refer to the license.txt file included.
|
||||
|
|
||||
|
#include <vector>
|
||||
|
|
||||
|
#include "common/common_types.h"
|
||||
|
#include "shader_recompiler/backend/spirv/emit_spirv.h"
|
||||
|
#include "shader_recompiler/environment.h"
|
||||
|
#include "shader_recompiler/frontend/maxwell/control_flow.h"
|
||||
|
#include "shader_recompiler/frontend/maxwell/program.h"
|
||||
|
#include "shader_recompiler/object_pool.h"
|
||||
|
#include "shader_recompiler/recompiler.h"
|
||||
|
|
||||
|
namespace Shader { |
||||
|
|
||||
|
std::pair<Info, std::vector<u32>> RecompileSPIRV(Environment& env, u32 start_address) { |
||||
|
ObjectPool<Maxwell::Flow::Block> flow_block_pool; |
||||
|
ObjectPool<IR::Inst> inst_pool; |
||||
|
ObjectPool<IR::Block> block_pool; |
||||
|
|
||||
|
Maxwell::Flow::CFG cfg{env, flow_block_pool, start_address}; |
||||
|
IR::Program program{Maxwell::TranslateProgram(inst_pool, block_pool, env, cfg)}; |
||||
|
return {std::move(program.info), Backend::SPIRV::EmitSPIRV(env, program)}; |
||||
|
} |
||||
|
|
||||
|
} // namespace Shader
|
||||
@ -0,0 +1,18 @@ |
|||||
|
// Copyright 2021 yuzu Emulator Project |
||||
|
// Licensed under GPLv2 or any later version |
||||
|
// Refer to the license.txt file included. |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include <utility> |
||||
|
#include <vector> |
||||
|
|
||||
|
#include "common/common_types.h" |
||||
|
#include "shader_recompiler/environment.h" |
||||
|
#include "shader_recompiler/shader_info.h" |
||||
|
|
||||
|
namespace Shader { |
||||
|
|
||||
|
[[nodiscard]] std::pair<Info, std::vector<u32>> RecompileSPIRV(Environment& env, u32 start_address); |
||||
|
|
||||
|
} // namespace Shader |
||||
2298
src/video_core/engines/shader_bytecode.h
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,158 +0,0 @@ |
|||||
// Copyright 2018 yuzu Emulator Project |
|
||||
// Licensed under GPLv2 or any later version |
|
||||
// Refer to the license.txt file included. |
|
||||
|
|
||||
#pragma once |
|
||||
|
|
||||
#include <array> |
|
||||
#include <optional> |
|
||||
|
|
||||
#include "common/bit_field.h" |
|
||||
#include "common/common_funcs.h" |
|
||||
#include "common/common_types.h" |
|
||||
|
|
||||
namespace Tegra::Shader { |
|
||||
|
|
||||
enum class OutputTopology : u32 { |
|
||||
PointList = 1, |
|
||||
LineStrip = 6, |
|
||||
TriangleStrip = 7, |
|
||||
}; |
|
||||
|
|
||||
enum class PixelImap : u8 { |
|
||||
Unused = 0, |
|
||||
Constant = 1, |
|
||||
Perspective = 2, |
|
||||
ScreenLinear = 3, |
|
||||
}; |
|
||||
|
|
||||
// Documentation in: |
|
||||
// http://download.nvidia.com/open-gpu-doc/Shader-Program-Header/1/Shader-Program-Header.html |
|
||||
struct Header { |
|
||||
union { |
|
||||
BitField<0, 5, u32> sph_type; |
|
||||
BitField<5, 5, u32> version; |
|
||||
BitField<10, 4, u32> shader_type; |
|
||||
BitField<14, 1, u32> mrt_enable; |
|
||||
BitField<15, 1, u32> kills_pixels; |
|
||||
BitField<16, 1, u32> does_global_store; |
|
||||
BitField<17, 4, u32> sass_version; |
|
||||
BitField<21, 5, u32> reserved; |
|
||||
BitField<26, 1, u32> does_load_or_store; |
|
||||
BitField<27, 1, u32> does_fp64; |
|
||||
BitField<28, 4, u32> stream_out_mask; |
|
||||
} common0; |
|
||||
|
|
||||
union { |
|
||||
BitField<0, 24, u32> shader_local_memory_low_size; |
|
||||
BitField<24, 8, u32> per_patch_attribute_count; |
|
||||
} common1; |
|
||||
|
|
||||
union { |
|
||||
BitField<0, 24, u32> shader_local_memory_high_size; |
|
||||
BitField<24, 8, u32> threads_per_input_primitive; |
|
||||
} common2; |
|
||||
|
|
||||
union { |
|
||||
BitField<0, 24, u32> shader_local_memory_crs_size; |
|
||||
BitField<24, 4, OutputTopology> output_topology; |
|
||||
BitField<28, 4, u32> reserved; |
|
||||
} common3; |
|
||||
|
|
||||
union { |
|
||||
BitField<0, 12, u32> max_output_vertices; |
|
||||
BitField<12, 8, u32> store_req_start; // NOTE: not used by geometry shaders. |
|
||||
BitField<20, 4, u32> reserved; |
|
||||
BitField<24, 8, u32> store_req_end; // NOTE: not used by geometry shaders. |
|
||||
} common4; |
|
||||
|
|
||||
union { |
|
||||
struct { |
|
||||
INSERT_PADDING_BYTES_NOINIT(3); // ImapSystemValuesA |
|
||||
INSERT_PADDING_BYTES_NOINIT(1); // ImapSystemValuesB |
|
||||
INSERT_PADDING_BYTES_NOINIT(16); // ImapGenericVector[32] |
|
||||
INSERT_PADDING_BYTES_NOINIT(2); // ImapColor |
|
||||
union { |
|
||||
BitField<0, 8, u16> clip_distances; |
|
||||
BitField<8, 1, u16> point_sprite_s; |
|
||||
BitField<9, 1, u16> point_sprite_t; |
|
||||
BitField<10, 1, u16> fog_coordinate; |
|
||||
BitField<12, 1, u16> tessellation_eval_point_u; |
|
||||
BitField<13, 1, u16> tessellation_eval_point_v; |
|
||||
BitField<14, 1, u16> instance_id; |
|
||||
BitField<15, 1, u16> vertex_id; |
|
||||
}; |
|
||||
INSERT_PADDING_BYTES_NOINIT(5); // ImapFixedFncTexture[10] |
|
||||
INSERT_PADDING_BYTES_NOINIT(1); // ImapReserved |
|
||||
INSERT_PADDING_BYTES_NOINIT(3); // OmapSystemValuesA |
|
||||
INSERT_PADDING_BYTES_NOINIT(1); // OmapSystemValuesB |
|
||||
INSERT_PADDING_BYTES_NOINIT(16); // OmapGenericVector[32] |
|
||||
INSERT_PADDING_BYTES_NOINIT(2); // OmapColor |
|
||||
INSERT_PADDING_BYTES_NOINIT(2); // OmapSystemValuesC |
|
||||
INSERT_PADDING_BYTES_NOINIT(5); // OmapFixedFncTexture[10] |
|
||||
INSERT_PADDING_BYTES_NOINIT(1); // OmapReserved |
|
||||
} vtg; |
|
||||
|
|
||||
struct { |
|
||||
INSERT_PADDING_BYTES_NOINIT(3); // ImapSystemValuesA |
|
||||
INSERT_PADDING_BYTES_NOINIT(1); // ImapSystemValuesB |
|
||||
|
|
||||
union { |
|
||||
BitField<0, 2, PixelImap> x; |
|
||||
BitField<2, 2, PixelImap> y; |
|
||||
BitField<4, 2, PixelImap> z; |
|
||||
BitField<6, 2, PixelImap> w; |
|
||||
u8 raw; |
|
||||
} imap_generic_vector[32]; |
|
||||
|
|
||||
INSERT_PADDING_BYTES_NOINIT(2); // ImapColor |
|
||||
INSERT_PADDING_BYTES_NOINIT(2); // ImapSystemValuesC |
|
||||
INSERT_PADDING_BYTES_NOINIT(10); // ImapFixedFncTexture[10] |
|
||||
INSERT_PADDING_BYTES_NOINIT(2); // ImapReserved |
|
||||
|
|
||||
struct { |
|
||||
u32 target; |
|
||||
union { |
|
||||
BitField<0, 1, u32> sample_mask; |
|
||||
BitField<1, 1, u32> depth; |
|
||||
BitField<2, 30, u32> reserved; |
|
||||
}; |
|
||||
} omap; |
|
||||
|
|
||||
bool IsColorComponentOutputEnabled(u32 render_target, u32 component) const { |
|
||||
const u32 bit = render_target * 4 + component; |
|
||||
return omap.target & (1 << bit); |
|
||||
} |
|
||||
|
|
||||
PixelImap GetPixelImap(u32 attribute) const { |
|
||||
const auto get_index = [this, attribute](u32 index) { |
|
||||
return static_cast<PixelImap>( |
|
||||
(imap_generic_vector[attribute].raw >> (index * 2)) & 3); |
|
||||
}; |
|
||||
|
|
||||
std::optional<PixelImap> result; |
|
||||
for (u32 component = 0; component < 4; ++component) { |
|
||||
const PixelImap index = get_index(component); |
|
||||
if (index == PixelImap::Unused) { |
|
||||
continue; |
|
||||
} |
|
||||
if (result && result != index) { |
|
||||
LOG_CRITICAL(HW_GPU, "Generic attribute conflict in interpolation mode"); |
|
||||
} |
|
||||
result = index; |
|
||||
} |
|
||||
return result.value_or(PixelImap::Unused); |
|
||||
} |
|
||||
} ps; |
|
||||
|
|
||||
std::array<u32, 0xF> raw; |
|
||||
}; |
|
||||
|
|
||||
u64 GetLocalMemorySize() const { |
|
||||
return (common1.shader_local_memory_low_size | |
|
||||
(common2.shader_local_memory_high_size << 24)); |
|
||||
} |
|
||||
}; |
|
||||
static_assert(sizeof(Header) == 0x50, "Incorrect structure size"); |
|
||||
|
|
||||
} // namespace Tegra::Shader |
|
||||
@ -0,0 +1,36 @@ |
|||||
|
// Copyright 2019 yuzu Emulator Project |
||||
|
// Licensed under GPLv2 or any later version |
||||
|
// Refer to the license.txt file included. |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include <cstddef> |
||||
|
|
||||
|
#include "video_core/vulkan_common/vulkan_wrapper.h" |
||||
|
|
||||
|
namespace Vulkan { |
||||
|
|
||||
|
class Pipeline { |
||||
|
public: |
||||
|
/// Add a reference count to the pipeline |
||||
|
void AddRef() noexcept { |
||||
|
++ref_count; |
||||
|
} |
||||
|
|
||||
|
[[nodiscard]] bool RemoveRef() noexcept { |
||||
|
--ref_count; |
||||
|
return ref_count == 0; |
||||
|
} |
||||
|
|
||||
|
[[nodiscard]] u64 UsageTick() const noexcept { |
||||
|
return usage_tick; |
||||
|
} |
||||
|
|
||||
|
protected: |
||||
|
u64 usage_tick{}; |
||||
|
|
||||
|
private: |
||||
|
size_t ref_count{}; |
||||
|
}; |
||||
|
|
||||
|
} // namespace Vulkan |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue