Skip to content

Commit 4db2ba6

Browse files
committed
Extend "get_resource_desc" API to optionally also return resource type and memory usage
1 parent 1253de6 commit 4db2ba6

14 files changed

+156
-96
lines changed

include/reshade_api.hpp

+4-6
Original file line numberDiff line numberDiff line change
@@ -327,12 +327,10 @@ namespace reshade { namespace api
327327
/// Gets the description of the specified <paramref name="resource"/>.
328328
/// This function is thread-safe.
329329
/// </summary>
330-
virtual resource_desc get_resource_desc(resource_handle resource) const = 0;
331-
/// <summary>
332-
/// Gets the type of the specified <paramref name="resource"/>.
333-
/// This function is thread-safe.
334-
/// </summary>
335-
virtual resource_type get_resource_type(resource_handle resource) const = 0;
330+
/// <param name="resource">The resource to get the description from.</param>
331+
/// <param name="out_type">Optional pointer to a variable that is set to the type of the resource. Can be <c>nullptr</c> to not get this information.</param>
332+
/// <param name="out_mem_usage">Optional pointer to a variable that is set to the memory usage of the resource. Can be <c>nullptr</c> to not get this information.</param>
333+
virtual resource_desc get_resource_desc(resource_handle resource, resource_type *out_type = nullptr, memory_usage *out_mem_usage = nullptr) const = 0;
336334

337335
/// <summary>
338336
/// Waits for all issued GPU operations to finish before returning.

source/d3d10/render_d3d10.cpp

+23-14
Original file line numberDiff line numberDiff line change
@@ -203,57 +203,66 @@ void reshade::d3d10::device_impl::get_resource_from_view(api::resource_view_hand
203203
*out_resource = { reinterpret_cast<uintptr_t>(resource.get()) };
204204
}
205205

206-
reshade::api::resource_desc reshade::d3d10::device_impl::get_resource_desc(api::resource_handle resource) const
206+
reshade::api::resource_desc reshade::d3d10::device_impl::get_resource_desc(api::resource_handle resource, api::resource_type *out_type, api::memory_usage *out_mem_usage) const
207207
{
208208
assert(resource.handle != 0);
209209
const auto resource_object = reinterpret_cast<ID3D10Resource *>(resource.handle);
210210

211211
D3D10_RESOURCE_DIMENSION dimension;
212212
resource_object->GetType(&dimension);
213+
214+
static_assert(
215+
D3D10_RESOURCE_DIMENSION_BUFFER == static_cast<uint32_t>(api::resource_type::buffer) &&
216+
D3D10_RESOURCE_DIMENSION_TEXTURE1D == static_cast<uint32_t>(api::resource_type::texture_1d) &&
217+
D3D10_RESOURCE_DIMENSION_TEXTURE2D == static_cast<uint32_t>(api::resource_type::texture_2d) &&
218+
D3D10_RESOURCE_DIMENSION_TEXTURE3D == static_cast<uint32_t>(api::resource_type::texture_3d));
219+
220+
if (out_type != nullptr)
221+
*out_type = static_cast<api::resource_type>(dimension);
222+
213223
switch (dimension)
214224
{
215225
case D3D10_RESOURCE_DIMENSION_BUFFER:
216226
{
217227
D3D10_BUFFER_DESC internal_desc;
218228
static_cast<ID3D10Buffer *>(resource_object)->GetDesc(&internal_desc);
229+
230+
if (out_mem_usage != nullptr)
231+
*out_mem_usage = convert_memory_usage(internal_desc.Usage);
219232
return convert_resource_desc(internal_desc);
220233
}
221234
case D3D10_RESOURCE_DIMENSION_TEXTURE1D:
222235
{
223236
D3D10_TEXTURE1D_DESC internal_desc;
224237
static_cast<ID3D10Texture1D *>(resource_object)->GetDesc(&internal_desc);
238+
239+
if (out_mem_usage != nullptr)
240+
*out_mem_usage = convert_memory_usage(internal_desc.Usage);
225241
return convert_resource_desc(internal_desc);
226242
}
227243
case D3D10_RESOURCE_DIMENSION_TEXTURE2D:
228244
{
229245
D3D10_TEXTURE2D_DESC internal_desc;
230246
static_cast<ID3D10Texture2D *>(resource_object)->GetDesc(&internal_desc);
247+
248+
if (out_mem_usage != nullptr)
249+
*out_mem_usage = convert_memory_usage(internal_desc.Usage);
231250
return convert_resource_desc(internal_desc);
232251
}
233252
case D3D10_RESOURCE_DIMENSION_TEXTURE3D:
234253
{
235254
D3D10_TEXTURE3D_DESC internal_desc;
236255
static_cast<ID3D10Texture3D *>(resource_object)->GetDesc(&internal_desc);
256+
257+
if (out_mem_usage != nullptr)
258+
*out_mem_usage = convert_memory_usage(internal_desc.Usage);
237259
return convert_resource_desc(internal_desc);
238260
}
239261
}
240262

241263
assert(false); // Not implemented
242264
return {};
243265
}
244-
reshade::api::resource_type reshade::d3d10::device_impl::get_resource_type(api::resource_handle resource) const
245-
{
246-
static_assert(
247-
D3D10_RESOURCE_DIMENSION_BUFFER == static_cast<uint32_t>(api::resource_type::buffer) &&
248-
D3D10_RESOURCE_DIMENSION_TEXTURE1D == static_cast<uint32_t>(api::resource_type::texture_1d) &&
249-
D3D10_RESOURCE_DIMENSION_TEXTURE2D == static_cast<uint32_t>(api::resource_type::texture_2d) &&
250-
D3D10_RESOURCE_DIMENSION_TEXTURE3D == static_cast<uint32_t>(api::resource_type::texture_3d));
251-
252-
assert(resource.handle != 0);
253-
D3D10_RESOURCE_DIMENSION dimension;
254-
reinterpret_cast<ID3D10Resource *>(resource.handle)->GetType(&dimension);
255-
return static_cast<api::resource_type>(dimension);
256-
}
257266

258267
void reshade::d3d10::device_impl::flush_immediate_command_list() const
259268
{

source/d3d10/render_d3d10.hpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@ namespace reshade::d3d10
3333

3434
void get_resource_from_view(api::resource_view_handle view, api::resource_handle *resource) const final;
3535

36-
api::resource_desc get_resource_desc(api::resource_handle resource) const final;
37-
api::resource_type get_resource_type(api::resource_handle resource) const final;
36+
api::resource_desc get_resource_desc(api::resource_handle resource, api::resource_type *out_type, api::memory_usage *out_mem_usage) const final;
3837

3938
void wait_idle() const final { /* no-op */ }
4039

source/d3d11/render_d3d11.cpp

+23-14
Original file line numberDiff line numberDiff line change
@@ -215,57 +215,66 @@ void reshade::d3d11::device_impl::get_resource_from_view(api::resource_view_hand
215215
*out_resource = { reinterpret_cast<uintptr_t>(resource.get()) };
216216
}
217217

218-
reshade::api::resource_desc reshade::d3d11::device_impl::get_resource_desc(api::resource_handle resource) const
218+
reshade::api::resource_desc reshade::d3d11::device_impl::get_resource_desc(api::resource_handle resource, api::resource_type *out_type, api::memory_usage *out_mem_usage) const
219219
{
220220
assert(resource.handle != 0);
221221
const auto resource_object = reinterpret_cast<ID3D11Resource *>(resource.handle);
222222

223223
D3D11_RESOURCE_DIMENSION dimension;
224224
resource_object->GetType(&dimension);
225+
226+
static_assert(
227+
D3D10_RESOURCE_DIMENSION_BUFFER == static_cast<uint32_t>(api::resource_type::buffer) &&
228+
D3D10_RESOURCE_DIMENSION_TEXTURE1D == static_cast<uint32_t>(api::resource_type::texture_1d) &&
229+
D3D10_RESOURCE_DIMENSION_TEXTURE2D == static_cast<uint32_t>(api::resource_type::texture_2d) &&
230+
D3D10_RESOURCE_DIMENSION_TEXTURE3D == static_cast<uint32_t>(api::resource_type::texture_3d));
231+
232+
if (out_type != nullptr)
233+
*out_type = static_cast<api::resource_type>(dimension);
234+
225235
switch (dimension)
226236
{
227237
case D3D11_RESOURCE_DIMENSION_BUFFER:
228238
{
229239
D3D11_BUFFER_DESC internal_desc;
230240
static_cast<ID3D11Buffer *>(resource_object)->GetDesc(&internal_desc);
241+
242+
if (out_mem_usage != nullptr)
243+
*out_mem_usage = convert_memory_usage(internal_desc.Usage);
231244
return convert_resource_desc(internal_desc);
232245
}
233246
case D3D11_RESOURCE_DIMENSION_TEXTURE1D:
234247
{
235248
D3D11_TEXTURE1D_DESC internal_desc;
236249
static_cast<ID3D11Texture1D *>(resource_object)->GetDesc(&internal_desc);
250+
251+
if (out_mem_usage != nullptr)
252+
*out_mem_usage = convert_memory_usage(internal_desc.Usage);
237253
return convert_resource_desc(internal_desc);
238254
}
239255
case D3D11_RESOURCE_DIMENSION_TEXTURE2D:
240256
{
241257
D3D11_TEXTURE2D_DESC internal_desc;
242258
static_cast<ID3D11Texture2D *>(resource_object)->GetDesc(&internal_desc);
259+
260+
if (out_mem_usage != nullptr)
261+
*out_mem_usage = convert_memory_usage(internal_desc.Usage);
243262
return convert_resource_desc(internal_desc);
244263
}
245264
case D3D11_RESOURCE_DIMENSION_TEXTURE3D:
246265
{
247266
D3D11_TEXTURE3D_DESC internal_desc;
248267
static_cast<ID3D11Texture3D *>(resource_object)->GetDesc(&internal_desc);
268+
269+
if (out_mem_usage != nullptr)
270+
*out_mem_usage = convert_memory_usage(internal_desc.Usage);
249271
return convert_resource_desc(internal_desc);
250272
}
251273
}
252274

253275
assert(false); // Not implemented
254276
return {};
255277
}
256-
reshade::api::resource_type reshade::d3d11::device_impl::get_resource_type(api::resource_handle resource) const
257-
{
258-
static_assert(
259-
D3D10_RESOURCE_DIMENSION_BUFFER == static_cast<uint32_t>(api::resource_type::buffer) &&
260-
D3D10_RESOURCE_DIMENSION_TEXTURE1D == static_cast<uint32_t>(api::resource_type::texture_1d) &&
261-
D3D10_RESOURCE_DIMENSION_TEXTURE2D == static_cast<uint32_t>(api::resource_type::texture_2d) &&
262-
D3D10_RESOURCE_DIMENSION_TEXTURE3D == static_cast<uint32_t>(api::resource_type::texture_3d));
263-
264-
assert(resource.handle != 0);
265-
D3D11_RESOURCE_DIMENSION dimension;
266-
reinterpret_cast<ID3D11Resource *>(resource.handle)->GetType(&dimension);
267-
return static_cast<api::resource_type>(dimension);
268-
}
269278

270279
reshade::d3d11::command_list_impl::command_list_impl(device_impl *device, ID3D11CommandList *cmd_list) :
271280
api_object_impl(cmd_list), _device_impl(device)

source/d3d11/render_d3d11.hpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,7 @@ namespace reshade::d3d11
3333

3434
void get_resource_from_view(api::resource_view_handle view, api::resource_handle *out_resource) const final;
3535

36-
api::resource_desc get_resource_desc(api::resource_handle resource) const final;
37-
api::resource_type get_resource_type(api::resource_handle resource) const final;
36+
api::resource_desc get_resource_desc(api::resource_handle resource, api::resource_type *out_type, api::memory_usage *out_mem_usage) const final;
3837

3938
void wait_idle() const final { /* no-op */ }
4039

source/d3d12/render_d3d12.cpp

+17-7
Original file line numberDiff line numberDiff line change
@@ -207,21 +207,31 @@ void reshade::d3d12::device_impl::get_resource_from_view(api::resource_view_hand
207207
*out_resource = { 0 };
208208
}
209209

210-
reshade::api::resource_desc reshade::d3d12::device_impl::get_resource_desc(api::resource_handle resource) const
210+
reshade::api::resource_desc reshade::d3d12::device_impl::get_resource_desc(api::resource_handle resource, api::resource_type *out_type, api::memory_usage *out_mem_usage) const
211211
{
212212
assert(resource.handle != 0);
213-
return convert_resource_desc(reinterpret_cast<ID3D12Resource *>(resource.handle)->GetDesc()).second;
214-
}
215-
reshade::api::resource_type reshade::d3d12::device_impl::get_resource_type(api::resource_handle resource) const
216-
{
213+
const D3D12_RESOURCE_DESC internal_desc = reinterpret_cast<ID3D12Resource *>(resource.handle)->GetDesc();
214+
217215
static_assert(
218216
D3D12_RESOURCE_DIMENSION_BUFFER == static_cast<uint32_t>(api::resource_type::buffer) &&
219217
D3D12_RESOURCE_DIMENSION_TEXTURE1D == static_cast<uint32_t>(api::resource_type::texture_1d) &&
220218
D3D12_RESOURCE_DIMENSION_TEXTURE2D == static_cast<uint32_t>(api::resource_type::texture_2d) &&
221219
D3D12_RESOURCE_DIMENSION_TEXTURE3D == static_cast<uint32_t>(api::resource_type::texture_3d));
222220

223-
assert(resource.handle != 0);
224-
return static_cast<api::resource_type>(reinterpret_cast<ID3D12Resource *>(resource.handle)->GetDesc().Dimension);
221+
if (out_type != nullptr)
222+
*out_type = static_cast<api::resource_type>(internal_desc.Dimension);
223+
224+
if (out_mem_usage != nullptr)
225+
{
226+
D3D12_HEAP_FLAGS heap_flags;
227+
D3D12_HEAP_PROPERTIES heap_props;
228+
if (SUCCEEDED(reinterpret_cast<ID3D12Resource *>(resource.handle)->GetHeapProperties(&heap_props, &heap_flags)))
229+
*out_mem_usage = convert_memory_usage(heap_props.Type);
230+
else
231+
*out_mem_usage = api::memory_usage::unknown;
232+
}
233+
234+
return convert_resource_desc(internal_desc).second;
225235
}
226236

227237
void reshade::d3d12::device_impl::wait_idle() const

source/d3d12/render_d3d12.hpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,7 @@ namespace reshade::d3d12
3737

3838
void get_resource_from_view(api::resource_view_handle view, api::resource_handle *out_resource) const final;
3939

40-
api::resource_desc get_resource_desc(api::resource_handle resource) const final;
41-
api::resource_type get_resource_type(api::resource_handle resource) const final;
40+
api::resource_desc get_resource_desc(api::resource_handle resource, api::resource_type *out_type, api::memory_usage *out_mem_usage) const final;
4241

4342
void wait_idle() const final;
4443

0 commit comments

Comments
 (0)