Skip to content

Commit

Permalink
refactor: update reshade and api_object data access
Browse files Browse the repository at this point in the history
  • Loading branch information
clshortfuse committed Feb 26, 2025
1 parent 8729fa5 commit a2df7d3
Show file tree
Hide file tree
Showing 20 changed files with 474 additions and 482 deletions.
100 changes: 50 additions & 50 deletions src/devkit/addon.cpp

Large diffs are not rendered by default.

50 changes: 25 additions & 25 deletions src/games/bioshock/addon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -145,7 +145,7 @@ struct __declspec(uuid("1228220F-364A-46A2-BB29-1CCE591A018A")) DeviceData {
constexpr reshade::api::pipeline_layout PIPELINE_LAYOUT{0};

void OnInitDevice(reshade::api::device* device) {
auto& data = device->create_private_data<DeviceData>();
auto* data = device->create_private_data<DeviceData>();

// create pipeline
{
Expand Down Expand Up @@ -197,7 +197,7 @@ void OnInitDevice(reshade::api::device* device) {

subobjects.push_back({reshade::api::pipeline_subobject_type::depth_stencil_state, 1, &depth_stencil_state});

device->create_pipeline(PIPELINE_LAYOUT, static_cast<uint32_t>(subobjects.size()), subobjects.data(), &data.final_pipeline);
device->create_pipeline(PIPELINE_LAYOUT, static_cast<uint32_t>(subobjects.size()), subobjects.data(), &data->final_pipeline);
}

// create layout
Expand All @@ -207,15 +207,15 @@ void OnInitDevice(reshade::api::device* device) {
new_params.push_constants.count = 1;
new_params.push_constants.dx_register_index = 13;
new_params.push_constants.visibility = reshade::api::shader_stage::vertex | reshade::api::shader_stage::pixel | reshade::api::shader_stage::compute;
device->create_pipeline_layout(1, &new_params, &data.final_layout);
device->create_pipeline_layout(1, &new_params, &data->final_layout);
}
}

void OnDestroyDevice(reshade::api::device* device) {
auto& data = device->get_private_data<DeviceData>();
auto* data = device->get_private_data<DeviceData>();

device->destroy_pipeline(data.final_pipeline);
device->destroy_pipeline_layout(data.final_layout);
device->destroy_pipeline(data->final_pipeline);
device->destroy_pipeline_layout(data->final_layout);

device->destroy_private_data<DeviceData>();
}
Expand All @@ -224,7 +224,7 @@ bool fired_on_init_swapchain = false;

void OnInitSwapchain(reshade::api::swapchain* swapchain, bool resize) {
auto device = swapchain->get_device();
auto& data = device->get_private_data<DeviceData>();
auto* data = device->get_private_data<DeviceData>();

if (!fired_on_init_swapchain) {
fired_on_init_swapchain = true;
Expand All @@ -239,7 +239,7 @@ void OnInitSwapchain(reshade::api::swapchain* swapchain, bool resize) {
auto back_buffer_resource = swapchain->get_back_buffer(i);
auto back_buffer_desc = device->get_resource_desc(back_buffer_resource);
auto desc = reshade::api::resource_view_desc(reshade::api::resource_view_type::texture_2d, reshade::api::format_to_default_typed(back_buffer_desc.texture.format), 0, 1, 0, 1);
device->create_resource_view(back_buffer_resource, reshade::api::resource_usage::render_target, desc, &data.swapchain_rtvs.emplace_back());
device->create_resource_view(back_buffer_resource, reshade::api::resource_usage::render_target, desc, &data->swapchain_rtvs.emplace_back());
}

// create copy target
Expand All @@ -259,61 +259,61 @@ void OnInitSwapchain(reshade::api::swapchain* swapchain, bool resize) {
desc.heap = reshade::api::memory_heap::gpu_only;
desc.usage = reshade::api::resource_usage::copy_dest | reshade::api::resource_usage::shader_resource;
desc.flags = reshade::api::resource_flags::none;
device->create_resource(desc, nullptr, reshade::api::resource_usage::shader_resource, &data.final_texture);
device->create_resource_view(data.final_texture, reshade::api::resource_usage::shader_resource, reshade::api::resource_view_desc(reshade::api::format_to_default_typed(desc.texture.format)), &data.final_texture_view);
device->create_sampler({}, &data.final_texture_sampler);
device->create_resource(desc, nullptr, reshade::api::resource_usage::shader_resource, &data->final_texture);
device->create_resource_view(data->final_texture, reshade::api::resource_usage::shader_resource, reshade::api::resource_view_desc(reshade::api::format_to_default_typed(desc.texture.format)), &data->final_texture_view);
device->create_sampler({}, &data->final_texture_sampler);
}
}

void OnDestroySwapchain(reshade::api::swapchain* swapchain, bool resize) {
auto device = swapchain->get_device();
auto& data = device->get_private_data<DeviceData>();
auto* data = device->get_private_data<DeviceData>();

for (const auto& rtv : data.swapchain_rtvs) {
for (const auto& rtv : data->swapchain_rtvs) {
device->destroy_resource_view(rtv);
}

data.swapchain_rtvs.clear();
data->swapchain_rtvs.clear();

device->destroy_sampler(data.final_texture_sampler);
device->destroy_resource_view(data.final_texture_view);
device->destroy_resource(data.final_texture);
device->destroy_sampler(data->final_texture_sampler);
device->destroy_resource_view(data->final_texture_view);
device->destroy_resource(data->final_texture);
}

// more or less the same as what reshade does to render its techniques
void OnPresent(reshade::api::command_queue* queue, reshade::api::swapchain* swapchain, const reshade::api::rect* source_rect, const reshade::api::rect* dest_rect, uint32_t dirty_rect_count, const reshade::api::rect* dirty_rects) {
auto device = queue->get_device();
auto cmd_list = queue->get_immediate_command_list();

auto& data = device->get_private_data<DeviceData>();
auto* data = device->get_private_data<DeviceData>();

auto back_buffer_resource = swapchain->get_current_back_buffer();
auto back_buffer_desc = device->get_resource_desc(back_buffer_resource);

// copy backbuffer
{
const reshade::api::resource resources[2] = {back_buffer_resource, data.final_texture};
const reshade::api::resource resources[2] = {back_buffer_resource, data->final_texture};
const reshade::api::resource_usage state_old[2] = {reshade::api::resource_usage::render_target, reshade::api::resource_usage::shader_resource};
const reshade::api::resource_usage state_new[2] = {reshade::api::resource_usage::copy_source, reshade::api::resource_usage::copy_dest};

cmd_list->barrier(2, resources, state_old, state_new);
cmd_list->copy_texture_region(back_buffer_resource, 0, nullptr, data.final_texture, 0, nullptr);
cmd_list->copy_texture_region(back_buffer_resource, 0, nullptr, data->final_texture, 0, nullptr);
cmd_list->barrier(2, resources, state_new, state_old);
}

cmd_list->bind_pipeline(reshade::api::pipeline_stage::all_graphics, data.final_pipeline);
cmd_list->bind_pipeline(reshade::api::pipeline_stage::all_graphics, data->final_pipeline);

cmd_list->barrier(back_buffer_resource, reshade::api::resource_usage::shader_resource, reshade::api::resource_usage::render_target);

reshade::api::render_pass_render_target_desc render_target = {};
render_target.view = data.swapchain_rtvs.at(swapchain->get_current_back_buffer_index());
render_target.view = data->swapchain_rtvs.at(swapchain->get_current_back_buffer_index());
cmd_list->begin_render_pass(1, &render_target, nullptr);

cmd_list->push_descriptors(reshade::api::shader_stage::all_graphics, PIPELINE_LAYOUT, 0, reshade::api::descriptor_table_update{{}, 0, 0, 1, reshade::api::descriptor_type::texture_shader_resource_view, &data.final_texture_view});
cmd_list->push_descriptors(reshade::api::shader_stage::all_graphics, PIPELINE_LAYOUT, 0, reshade::api::descriptor_table_update{{}, 0, 0, 1, reshade::api::descriptor_type::sampler, &data.final_texture_sampler});
cmd_list->push_descriptors(reshade::api::shader_stage::all_graphics, PIPELINE_LAYOUT, 0, reshade::api::descriptor_table_update{{}, 0, 0, 1, reshade::api::descriptor_type::texture_shader_resource_view, &data->final_texture_view});
cmd_list->push_descriptors(reshade::api::shader_stage::all_graphics, PIPELINE_LAYOUT, 0, reshade::api::descriptor_table_update{{}, 0, 0, 1, reshade::api::descriptor_type::sampler, &data->final_texture_sampler});

// push the renodx settings
cmd_list->push_constants(reshade::api::shader_stage::all_graphics, data.final_layout, 0, 0, sizeof(shader_injection) / 4, &shader_injection);
cmd_list->push_constants(reshade::api::shader_stage::all_graphics, data->final_layout, 0, 0, sizeof(shader_injection) / 4, &shader_injection);

const reshade::api::viewport viewport = {
0.0f, 0.0f,
Expand Down
52 changes: 26 additions & 26 deletions src/games/dyinglight/addon.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,7 @@ struct __declspec(uuid("1228220F-364A-46A2-BB29-1CCE591A018A")) DeviceData {
constexpr reshade::api::pipeline_layout PIPELINE_LAYOUT{0};

void OnInitDevice(reshade::api::device* device) {
auto& data = device->create_private_data<DeviceData>();
auto* data = device->create_private_data<DeviceData>();

// create pipeline
{
Expand Down Expand Up @@ -363,7 +363,7 @@ void OnInitDevice(reshade::api::device* device) {

subobjects.push_back({reshade::api::pipeline_subobject_type::depth_stencil_state, 1, &depth_stencil_state});

device->create_pipeline(PIPELINE_LAYOUT, static_cast<uint32_t>(subobjects.size()), subobjects.data(), &data.final_pipeline);
device->create_pipeline(PIPELINE_LAYOUT, static_cast<uint32_t>(subobjects.size()), subobjects.data(), &data->final_pipeline);
}

// create layout
Expand All @@ -373,7 +373,7 @@ void OnInitDevice(reshade::api::device* device) {
new_params.push_constants.count = 1;
new_params.push_constants.dx_register_index = 13;
new_params.push_constants.visibility = reshade::api::shader_stage::vertex | reshade::api::shader_stage::pixel | reshade::api::shader_stage::compute;
device->create_pipeline_layout(1, &new_params, &data.final_layout);
device->create_pipeline_layout(1, &new_params, &data->final_layout);
}

{
Expand All @@ -382,28 +382,28 @@ void OnInitDevice(reshade::api::device* device) {
new_params.push_constants.count = 1;
new_params.push_constants.dx_register_index = 12;
new_params.push_constants.visibility = reshade::api::shader_stage::vertex | reshade::api::shader_stage::pixel | reshade::api::shader_stage::compute;
device->create_pipeline_layout(1, &new_params, &data.copy_layout);
device->create_pipeline_layout(1, &new_params, &data->copy_layout);
}
}

void OnDestroyDevice(reshade::api::device* device) {
auto& data = device->get_private_data<DeviceData>();
auto* data = device->get_private_data<DeviceData>();

device->destroy_pipeline(data.final_pipeline);
device->destroy_pipeline_layout(data.final_layout);
device->destroy_pipeline(data->final_pipeline);
device->destroy_pipeline_layout(data->final_layout);

device->destroy_private_data<DeviceData>();
}

void OnInitSwapchain(reshade::api::swapchain* swapchain, bool resize) {
auto device = swapchain->get_device();
auto& data = device->get_private_data<DeviceData>();
auto* data = device->get_private_data<DeviceData>();

for (int i = 0; i < swapchain->get_back_buffer_count(); ++i) {
auto back_buffer_resource = swapchain->get_back_buffer(i);
auto back_buffer_desc = device->get_resource_desc(back_buffer_resource);
auto desc = reshade::api::resource_view_desc(reshade::api::resource_view_type::texture_2d, reshade::api::format_to_default_typed(back_buffer_desc.texture.format), 0, 1, 0, 1);
device->create_resource_view(back_buffer_resource, reshade::api::resource_usage::render_target, desc, &data.swapchain_rtvs.emplace_back());
device->create_resource_view(back_buffer_resource, reshade::api::resource_usage::render_target, desc, &data->swapchain_rtvs.emplace_back());
}

// create copy target
Expand All @@ -423,61 +423,61 @@ void OnInitSwapchain(reshade::api::swapchain* swapchain, bool resize) {
desc.heap = reshade::api::memory_heap::gpu_only;
desc.usage = reshade::api::resource_usage::copy_dest | reshade::api::resource_usage::shader_resource;
desc.flags = reshade::api::resource_flags::none;
device->create_resource(desc, nullptr, reshade::api::resource_usage::shader_resource, &data.final_texture);
device->create_resource_view(data.final_texture, reshade::api::resource_usage::shader_resource, reshade::api::resource_view_desc(reshade::api::format_to_default_typed(desc.texture.format)), &data.final_texture_view);
device->create_sampler({}, &data.final_texture_sampler);
device->create_resource(desc, nullptr, reshade::api::resource_usage::shader_resource, &data->final_texture);
device->create_resource_view(data->final_texture, reshade::api::resource_usage::shader_resource, reshade::api::resource_view_desc(reshade::api::format_to_default_typed(desc.texture.format)), &data->final_texture_view);
device->create_sampler({}, &data->final_texture_sampler);
}
}

void OnDestroySwapchain(reshade::api::swapchain* swapchain, bool resize) {
auto device = swapchain->get_device();
auto& data = device->get_private_data<DeviceData>();
auto* data = device->get_private_data<DeviceData>();

for (const auto& rtv : data.swapchain_rtvs) {
for (const auto& rtv : data->swapchain_rtvs) {
device->destroy_resource_view(rtv);
}

data.swapchain_rtvs.clear();
data->swapchain_rtvs.clear();

device->destroy_sampler(data.final_texture_sampler);
device->destroy_resource_view(data.final_texture_view);
device->destroy_resource(data.final_texture);
device->destroy_sampler(data->final_texture_sampler);
device->destroy_resource_view(data->final_texture_view);
device->destroy_resource(data->final_texture);
}

// more or less the same as what reshade does to render its techniques
void OnPresent(reshade::api::command_queue* queue, reshade::api::swapchain* swapchain, const reshade::api::rect* source_rect, const reshade::api::rect* dest_rect, uint32_t dirty_rect_count, const reshade::api::rect* dirty_rects) {
auto device = queue->get_device();
auto cmd_list = queue->get_immediate_command_list();

auto& data = device->get_private_data<DeviceData>();
auto* data = device->get_private_data<DeviceData>();

auto back_buffer_resource = swapchain->get_current_back_buffer();
auto back_buffer_desc = device->get_resource_desc(back_buffer_resource);

// copy backbuffer
{
const reshade::api::resource resources[2] = {back_buffer_resource, data.final_texture};
const reshade::api::resource resources[2] = {back_buffer_resource, data->final_texture};
const reshade::api::resource_usage state_old[2] = {reshade::api::resource_usage::render_target, reshade::api::resource_usage::shader_resource};
const reshade::api::resource_usage state_new[2] = {reshade::api::resource_usage::copy_source, reshade::api::resource_usage::copy_dest};

cmd_list->barrier(2, resources, state_old, state_new);
cmd_list->copy_texture_region(back_buffer_resource, 0, nullptr, data.final_texture, 0, nullptr);
cmd_list->copy_texture_region(back_buffer_resource, 0, nullptr, data->final_texture, 0, nullptr);
cmd_list->barrier(2, resources, state_new, state_old);
}

cmd_list->bind_pipeline(reshade::api::pipeline_stage::all_graphics, data.final_pipeline);
cmd_list->bind_pipeline(reshade::api::pipeline_stage::all_graphics, data->final_pipeline);

cmd_list->barrier(back_buffer_resource, reshade::api::resource_usage::shader_resource, reshade::api::resource_usage::render_target);

reshade::api::render_pass_render_target_desc render_target = {};
render_target.view = data.swapchain_rtvs.at(swapchain->get_current_back_buffer_index());
render_target.view = data->swapchain_rtvs.at(swapchain->get_current_back_buffer_index());
cmd_list->begin_render_pass(1, &render_target, nullptr);

cmd_list->push_descriptors(reshade::api::shader_stage::all_graphics, PIPELINE_LAYOUT, 0, reshade::api::descriptor_table_update{{}, 0, 0, 1, reshade::api::descriptor_type::texture_shader_resource_view, &data.final_texture_view});
cmd_list->push_descriptors(reshade::api::shader_stage::all_graphics, PIPELINE_LAYOUT, 0, reshade::api::descriptor_table_update{{}, 0, 0, 1, reshade::api::descriptor_type::sampler, &data.final_texture_sampler});
cmd_list->push_descriptors(reshade::api::shader_stage::all_graphics, PIPELINE_LAYOUT, 0, reshade::api::descriptor_table_update{{}, 0, 0, 1, reshade::api::descriptor_type::texture_shader_resource_view, &data->final_texture_view});
cmd_list->push_descriptors(reshade::api::shader_stage::all_graphics, PIPELINE_LAYOUT, 0, reshade::api::descriptor_table_update{{}, 0, 0, 1, reshade::api::descriptor_type::sampler, &data->final_texture_sampler});

// push the renodx settings
cmd_list->push_constants(reshade::api::shader_stage::all_graphics, data.final_layout, 0, 0, sizeof(shader_injection) / 4, &shader_injection);
cmd_list->push_constants(reshade::api::shader_stage::all_graphics, data->final_layout, 0, 0, sizeof(shader_injection) / 4, &shader_injection);

const reshade::api::viewport viewport = {
0.0f, 0.0f,
Expand Down
Loading

0 comments on commit a2df7d3

Please sign in to comment.