Skip to content

Commit cdab4f7

Browse files
committed
Fix GPU PageFault
1 parent c5154f0 commit cdab4f7

File tree

7 files changed

+20
-72
lines changed

7 files changed

+20
-72
lines changed

sources/DirectXFramework/DX12/CommandList.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1308,6 +1308,7 @@ namespace DX12
13081308

13091309
tracked_resources.clear();
13101310
tracked_psos.clear();
1311+
tracked_heaps.clear();
13111312
TrackedResource::allow_resource_delete = false;
13121313

13131314
transition_list = nullptr;

sources/DirectXFramework/DX12/CommandList.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,8 +298,11 @@ namespace DX12
298298
void reset();
299299

300300
std::list<ComPtr<ID3D12PipelineState>> tracked_psos;
301-
301+
302302
public:
303+
304+
std::list<ComPtr<ID3D12Heap>> tracked_heaps;
305+
303306
// UINT64 wait_for = -1;
304307
void flush_transitions();
305308

sources/DirectXFramework/DX12/Queue.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,9 @@ namespace DX12
246246
}
247247
else
248248
{
249+
250+
// Need to request other queue to make a proper transition.
251+
// It's OK, but better to avoid this
249252
auto queue = Device::get().get_queue(transition_list->get_type());
250253

251254
{

sources/RenderSystem/Assets/TiledTexture.cpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -571,23 +571,17 @@ void TiledTexture::update(Render::CommandList::ptr& list)
571571
load_tilings();
572572
});
573573
});
574-
// list->transition(visibility_texture.get(), Render::ResourceState::COPY_DEST);
575574
list->get_copy().update_buffer(visibility_texture.get(), 0, reinterpret_cast<char*>(clear_data.data()), UINT(clear_data.size() * 4));
576-
// list->transition(visibility_texture.get(), Render::ResourceState::COMMON);
577575

578576
if (residency_changed)
579577
{
580578
memcpy(residency_data_uploaded->array[0]->mips[0]->data.data(), residency_data->array[0]->mips[0]->data.data(), residency_data->array[0]->mips[0]->data.size());
581-
// list->transition(residency_texture.get(), Render::ResourceState::COPY_DEST);
582579
list->get_copy().update_texture(residency_texture, ivec3(0, 0, 0), ivec3(mips[0].tiles), 0, reinterpret_cast<const char*>(residency_data->array[0]->mips[0]->data.data()), residency_data->array[0]->mips[0]->width_stride);
583-
// list->transition(residency_texture.get(), Render::ResourceState::PIXEL_SHADER_RESOURCE);
584580
residency_changed = false;
585581
}
586582

587583
if (upload_tiles.size())
588584
{
589-
// list->transition(tiled_tex.get(), Render::ResourceState::COPY_DEST);
590-
591585
for (auto& t : upload_tiles)
592586
{
593587
ivec3 gpu_size = one_tile_size;
@@ -596,8 +590,7 @@ void TiledTexture::update(Render::CommandList::ptr& list)
596590
t->data.clear();
597591
}
598592

599-
// list->transition(tiled_tex.get(),Render::ResourceState::PIXEL_SHADER_RESOURCE);
600-
upload_tiles.clear();
593+
upload_tiles.clear();
601594
}
602595
}
603596

sources/RenderSystem/Assets/TiledTexture.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,12 @@ class TileHeapManager
187187
&rangeTileCounts[0],
188188
D3D12_TILE_MAPPING_FLAG_NONE
189189
);*/
190+
191+
192+
for (auto& p : pages)
193+
{
194+
list.tracked_heaps.push_back(p.get_native());
195+
}
190196
pages.clear();
191197

192198

sources/RenderSystem/Effects/VoxelGI/VoxelGIGraph.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ VoxelGI::VoxelGI(Scene::ptr& scene) :scene(scene)
137137
tiled_volume_albedo_static.reset(new Texture3DTiledDynamic(desc));
138138
tiled_volume_normal_static.reset(new Texture3DTiledDynamic(desc));
139139

140-
desc.MipLevels = 9;
140+
desc.MipLevels = 6;
141141
desc.Format = DXGI_FORMAT_R16G16B16A16_FLOAT;
142142
tiled_volume_lighted.reset(new Texture3DTiledDynamic(desc));
143143

sources/RenderSystem/TiledTextures/VisibilityBuffer.cpp

Lines changed: 4 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -23,67 +23,16 @@ void VisibilityBuffer::wait_for_results()
2323

2424
void VisibilityBuffer::update(CommandList::ptr& list)
2525
{
26-
27-
list->transition_uav(buffer.get());
28-
/*list->read_buffer(buffer.get(), 0, buffer->get_size(), [this](const char* data, UINT64 size)
29-
{
30-
std::vector<task<bool>> tasks;
31-
32-
33-
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
34-
// const int* i_data = reinterpret_cast<const int*>(data);
35-
size /= sizeof(int);
36-
37-
int thread_count = std::min(sizes.y, 8);
38-
int one_thread = size / thread_count;
39-
//memcpy(resolved_data.data(), data, size);
40-
// auto int_data = reinterpret_cast<const unsigned int*>(data);
41-
std::atomic_int counter = 0;
42-
// if (Application::get().is_alive())
43-
for (int thread = 0; thread < thread_count; thread++)
44-
tasks.emplace_back(create_task([this, thread, one_thread, data,&counter]()
45-
{
46-
47-
48-
for (int i = one_thread*thread; i < one_thread*thread + one_thread; i++)
49-
{
50-
51-
52-
int x = i % sizes.x;
53-
int z = i / (sizes.y*sizes.x);
54-
int y = ((i - x) / sizes.x) % sizes.y;
55-
if (data[4*i] == 0)
56-
++counter;
57-
process_tile_readback({ x,y,z }, data[4 * i]);
58-
59-
}
60-
return true;
61-
}));
62-
63-
for (auto &t : tasks)
64-
t.wait();
65-
66-
Log::get() << "counter " << counter.load() << Log::endl;
67-
68-
});*/
69-
26+
//TODO: GPU!!
7027
waiter = list->get_copy().read_buffer(buffer.get(), 0, buffer->get_size(), [this](const char* data, UINT64 size)
7128
{
72-
73-
74-
std::vector<task<std::vector<ivec3>>> tasks;
75-
76-
29+
std::vector<task<std::vector<ivec3>>> tasks;
7730
std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
78-
// const int* i_data = reinterpret_cast<const int*>(data);
7931
size /= sizeof(int);
8032

8133
int thread_count = std::min(sizes.y, 8);
8234
UINT one_thread = UINT(size / thread_count);
83-
//memcpy(resolved_data.data(), data, size);
84-
// auto int_data = reinterpret_cast<const unsigned int*>(data);
85-
86-
// if (Application::get().is_alive())
35+
8736
for (int thread = 0; thread < thread_count; thread++)
8837
tasks.emplace_back(create_task([this, thread, one_thread, data]()
8938
{
@@ -104,6 +53,7 @@ void VisibilityBuffer::update(CommandList::ptr& list)
10453
}
10554
return poses;
10655
}));
56+
10757
int counter = 0;
10858
for (auto &t : tasks)
10959
{
@@ -118,15 +68,7 @@ void VisibilityBuffer::update(CommandList::ptr& list)
11868

11969
});
12070

121-
122-
// list->transition_uav(buffer.get());
123-
// list->transition(buffer.get(), Render::ResourceState::COPY_DEST);
12471
list->get_copy().update_buffer(buffer.get(), 0, reinterpret_cast<char*>(clear_data.data()), (UINT)clear_data.size());
125-
// list->clear_
126-
// list->transition(buffer.get(), Render::ResourceState::UNORDERED_ACCESS);
127-
// list->transition_uav(buffer.get());
128-
129-
13072
}
13173

13274
void VisibilityBufferUniversal::process_tile_readback(ivec3 pos, char level)

0 commit comments

Comments
 (0)