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