Class ResourceExtractor

Nested Relationships

Nested Types

Inheritance Relationships

Base Types

Class Documentation

class ResourceExtractor : public gpa::playback::CallableReceiver, public gpa::playback::CallableBroadcaster, public gpa::playback::CallableCallbacks

Provides access to resource data for a captured range

To extract raw binary resource data for a given

ResourceInfo

, determine

which ResourceInfo(s) to extract using the MetadataExtractor. In this

example we're looking for RenderTargetInfo

objects bound at call index

128. To find

RenderTargetInfo objects we'll use GRAPHICS_OUTPUT for our ResourceInfo::Usage. As we encounter RenderTargetInfo

objects we'll fill

out the necessary fields in a std::vector<> of

ResourceExtractor::Request::Info

objects.

Note that a single

ResourceExtractor::Request

may have any number of ResourceExtractor::Request::Infos with

different ResourceInfos, call indices, and

ResourceInfo::Ex objects.

std::vector<ResourceExtractor::Request::Info> requestInfos;
auto usage = ResourceInfo::Usage::GRAPHICS_OUTPUT;
uint64_t callIndex = 128;
for (auto usage : usages) {
    for (auto const& resourceInfo : playbackEngine.GetMetadataExtractor().GetResourceInfos(usage, callIndex)) {
        resourceInfo.ProcessAs<TextureInfo>(
            [&](TextureInfo const& textureInfo) {
                ResourceExtractor::Request::Info request{};
                request.callIndex = callIndex;
                request.pResourceInfo = &textureInfo;
                requestInfos.push_back(request);
            });
    }
}
Once we have all of the Request::Info

objects that we're interested in we

need to fill out the necessary fields in

ResourceExtractor::Request

. We

start by filling out the number of

ResourceExtractor::Request::Info objects and a pointer to our ResourceExtractor::Request::Info

objects.

Next we get the storage requirements for our

ResourceExtractor::Request using GetRequestStorageSize()

and allocate a buffer to hold our data.

We fill out the

ResourceExtractor::Request

object's pData field with that

buffer and call Execute() on our

PlaybackEngine

.

Note that the call to playbackEngine.Execute() will cause the passed in

ResourceExtractor::Request::Info objects to be sorted.
ResourceExtractor::Request request{};
request.infoCount = requestInfos.size();
request.pInfos = requestInfos.data();
auto storageSize = playbackEngine.GetResourceExtractor().GetRequestStorageSize(request);
std::vector<uint8_t> resultStorage(storageSize);
request.pData = resultStorage.data();
playbackEngine.Execute(request);
Finally we loop over our ResourceExtractor::Requests and process each ResourceExtractor::Result. Note that ResourceExtractor::Result

will

evaluate to

true when converted to a bool

if it was successfully

extracted.

for (size_t i = 0; i < request.infoCount; ++i) {
   auto const& requestInfo = request.pInfos[i];
   auto const& result = requestInfo.result;
   if (requestInfo.pResourceInfo && result) {
       requestInfo.pResourceInfo->ProcessAs<TextureInfo>(
           [&](TextureInfo const& textureInfo) {
               ProcessExtractedTexture(textureInfo, result.dataSize, result.pData);
           });
   }
}

Public Functions

ResourceExtractor() = default

Constructs an instance of ResourceExtractor.

virtual ~ResourceExtractor()

Destroys this instance of ResourceExtractor.

size_t GetRequestStorageSize(Request const &request) const

Gets the size in bytes required to store the ResourceExtractor::Result for a given Request.

Note

Use this method to fill in the pData member of the given Request

Note

If this method is overriden the base implementation must be called

Parameters

request -- [in] The Request to get the ResourceExtractor::Result storage requirments for

Returns

The size in bytes required to store the ResourceExtractor::Result for the given Request

virtual void SetRequest(Request &request)

Sets a Request on this ResourceExtractor that will be processed during its next execution.

Note

This method will cause the given ResourceExtractor::Result object's ResourceExtractor::Result::Info objects to be sorted

Note

If this method is overriden the base implementation must be called

Parameters

request -- [in] The Request to set for this ResourceExtractor object's next execution

virtual void Clear()

Clears this ResourceExtractor object's Request and ResourceExtractor::Result objects.

Note

If this method is overriden the base implementation must be called

ResourceExtractor(MetadataExtractorEx const &metadataExtractor)
virtual void SetRequest(ResourceDataRequest const &request)
virtual ResourceDataResult GetResult()
virtual void PostSetupRange(CallableCache *pCallableCache) override
virtual void PreExecuteRange(CallableCache *pCallableCache) override
virtual void PreExecuteCall(Callable *pCallable, uint64_t callIndex) override
virtual void PostExecuteCall(Callable *pCallable, uint64_t callIndex) override
virtual void PostExecuteRange(CallableCache *pCallableCache) override
virtual void ConnectExecutionCallbacks(ExecutionCallbacks const &executionCallbacks) final override
virtual void DisconnectExecutionCallbacks() final override

Public Members

ExecutionCallbacks mExecutionCallbacks = {}

Protected Functions

virtual size_t GetRequestStorageSize(Request::Info const &requestInfo) const

Gets the size in bytes required to store the ResourceExtractor::Result::Info(s) for a given Request::Info @pram [in] requestInfo The Request::Info to get the ResourceExtractor::Result::Info storage requirements for.

Note

If this method is overriden the base implementation must be called

Returns

The size in bytes required to store the ResourceExtractor::Result::Info(s) for the given Request::Info

detail::Span<Request::Info> GetRequestInfos()

Gets all of the Request::Info objects currently set on this ResourceExtractor.

Returns

All of the Request::Info objects currently set on this ResourceExtractor

detail::Span<Request::Info> GetRequestInfos(uint64_t callIndex, Request::Execution stage)

Gets all of the Request::Info objects currently set on this ResourceExtractor for a given call index.

Parameters
  • callIndex -- [in] The call index to get the Request::Info objects for

  • stage -- [in] The stage to get the Request::Info objects for

Returns

All of the Request::Info objects currently set on this ResourceExtractor for the given call index

void WriteRequestResultData(size_t dataSize, uint8_t const *pData, Result &result)

Writes resource data to a given Result.

Parameters
  • dataSize -- [in] The size in bytes of the data to write to the given Result

  • pData -- [in] A pointer to the data to write to the given Result

  • result -- [in] The Result to write the given data to

Protected Attributes

MetadataExtractorEx const *mMetadataExtractor = {nullptr}

A pointer to the MetadataExtractor associated with this ResourceExtractor.

Request mCompatibilityRequest = {}
std::vector<Request::Info> mCompatibilityRequestInfos
std::vector<uint8_t> mCompatibiltyRequestStorage
struct Request

Parameters for obtaining resource data from a ResourceExtractor.

Public Types

enum class Execution

TODO: Documentation.

Values:

enumerator PreCall

TODO: Documentation.

enumerator PostCall

TODO: Documentation.

Public Functions

operator bool() const

Converts this ResourceExtractor::Request to a value indicating whether or not it's valid.

Note

A valid ResourceExtractor::Request has a non zero value for infoCount, a non null pointer for pInfos, and a non null pointer for pData

Public Members

size_t infoCount = {0}

This ResourceExtractor::Request object's ResourceExtractor::Request::Info count.

Info *pInfos = {nullptr}

This ResourceExtractor::Request object's ResourceExtractor::Request::Info objects.

uint8_t *pData = {nullptr}

A pointer to this ResourceExtractor::Request object's result storage.

Note

pData must point to a buffer at least as large as the value obtained from ResourceExtractor::GetRequestStorageSizeInBytes(request)

struct Info

Parameters for a single entry in a ResourceExtractor::Request.

Public Members

uint64_t callIndex = {0}

The call index to obtain resource data for.

Execution stage = {Execution::PostCall}
ResourceInfo const *pResourceInfo = {nullptr}

A pointer to the ResourceInfo to obtain resource data for.

ResourceInfo::Ex const *pResourceInfoEx = {nullptr}

A pointer to the ResourceInfo::Ex to obtain resource data for.

api_types::BufferRegion bufferRegion = {api_types::BufferRegion::WholeRegion}

The region of the buffer to objtain resource data for.

Note

This field is only used if pResourceInfo points to a BufferInfo object

Note

This field is only used if pResourceInfoEx is null

api_types::TextureRegion textureRegion = {api_types::TextureRegion::WholeRegion}

The region of the texture to objtain resource data for.

Note

This field is only used if pResourceInfo points to a TextureInfo object

Note

This field is only used if pResourceInfoEx is null

Result result = {}

The ResourceExtractor::Result populated when this ResourceExtractor::Request is submitted.

struct Result

Parameters for interpreting data obtained from a ResourceExtractor::Request.

Public Types

enum class State

Enumeration of possible states of ResourceExtractor::Result.

Values:

enumerator PENDING

Indicates that a ResourceExtractor::Request::Info has been created but not yet submitted.

enumerator SUCCESS

Indicates that a ResourceExtractor::Request::Info has been submitted and the resource was successfully extracted.

enumerator FAILURE_UNKNOWN

Indicates that a ResourceExtractor::Request::Info has been submitted and failed for an unknown reason.

enumerator FAILURE_UNSUPPORTED

Indicates that a ResourceExtractor::Request::Info was submitted for a pResourceInfo which does not support extraction.

enumerator FAILURE_NO_RESOURCE_INFO_SPECIFIED

Indicates that a ResourceExtractor::Request::Info was submitted wihout a pResourceInfo.

enumerator FAILURE_RESOURCE_INFO_MISMATCH

Indicates that a ResourceExtractor::Request::Info was submitted with a pResourceInfoEx that does not reference the given pResourceInfo.

enumerator FAILURE_REGION_OUT_OF_BOUNDS

Indicates that a ResourceExtractor::Request::Info was submitted with a BufferRegion or TextureRegion outside of the bounds of the given pResourceInfo.

enumerator FAILURE_INTERNAL

Indicates that an internal error occured, indicates that GPA Framework maintenance is required.

Public Functions

operator bool() const

Converts this ResourceExtractor::Result to a value indicating whether or not it's valid.

Note

A valid ResourceExtractor::Result has a state of State::SUCCESS, a non zero value for dataSize, and a non null pointer for pData

Public Members

State state = {State::PENDING}

This ResourceExtractor::Result object's state.

size_t dataSize = {0}

The size in bytes of the resource data referenced by this ResourceExtractor::Result.

uint8_t *pData = {nullptr}

A pointer to the resource data referenced by this ResourceExtractor::Result.

api_types::Format format = {api_types::GPA_FORMAT_UNKNOWN}

Pixel format of the result data. May be different to original texture format (planes)

size_t rowPitch = {0}

The size in bytes of a single row of data.

size_t slicePitch = {0}

The size in bytes of a single slice of data.