|
30 | 30 | #define RMT_TOKEN_SIZE_VIRTUAL_ALLOCATE (96 / 8) ///< Virtual Allocate Token Size, in bytes
|
31 | 31 | #define RMT_TOKEN_SIZE_RESOURCE_CREATE (56 / 8) ///< Resource Create Token Size, in bytes
|
32 | 32 | #define RMT_TOKEN_SIZE_RESOURCE_DESTROY (40 / 8) ///< Resource Destroy Token Size, in bytes
|
| 33 | +#define RMT_TOKEN_SIZE_RESOURCE_UPDATE (112 / 8) ///< Resource Update Token Size, in bytes |
33 | 34 |
|
34 | 35 | #define IMAGE_RESOURCE_TOKEN_SIZE (304 / 8) ///< Image Resource Token Size
|
35 | 36 | #define IMAGE_RESOURCE_TOKEN_SIZE_V1_6 (312 / 8) ///< Image Resource Token Size for V1.6 onwards
|
@@ -441,6 +442,10 @@ static int32_t GetTokenSize(RmtParser* rmt_parser, const uint16_t token_header)
|
441 | 442 | }
|
442 | 443 | case kRmtTokenTypeResourceDestroy:
|
443 | 444 | return RMT_TOKEN_SIZE_RESOURCE_DESTROY;
|
| 445 | + |
| 446 | + case kRmtTokenTypeResourceUpdate: |
| 447 | + return RMT_TOKEN_SIZE_RESOURCE_UPDATE; |
| 448 | + |
444 | 449 | default:
|
445 | 450 | RMT_ASSERT(false);
|
446 | 451 |
|
@@ -1387,6 +1392,38 @@ static RmtErrorCode ParseResourceDestroy(RmtParser* rmt_parser, const uint16_t t
|
1387 | 1392 | return kRmtOk;
|
1388 | 1393 | }
|
1389 | 1394 |
|
| 1395 | +// parse resource update |
| 1396 | +static RmtErrorCode ParseResourceUpdate(RmtParser* rmt_parser, |
| 1397 | + const uint16_t token_header, |
| 1398 | + RmtTokenResourceUpdate* out_resource_update) |
| 1399 | +{ |
| 1400 | + RMT_UNUSED(token_header); |
| 1401 | + |
| 1402 | + PopulateCommonFields(rmt_parser, &out_resource_update->common); |
| 1403 | + |
| 1404 | + uint8_t data[RMT_TOKEN_SIZE_RESOURCE_UPDATE]; |
| 1405 | + RmtErrorCode error_code = ReadBytes(rmt_parser, data, 0, sizeof(data)); |
| 1406 | + |
| 1407 | + RMT_RETURN_ON_ERROR(error_code == kRmtOk, error_code); |
| 1408 | + |
| 1409 | + out_resource_update->resource_identifier = ReadBitsFromBuffer(data, sizeof(data), 39, 8); |
| 1410 | + out_resource_update->subresource_id = (uint32_t)ReadBitsFromBuffer(data, sizeof(data), 71, 40); |
| 1411 | + out_resource_update->resource_type = (RmtResourceType)ReadBitsFromBuffer(data, sizeof(data), 77, 72); |
| 1412 | + // Resource types can be anything, but for now, the driver is only going to log buffers: |
| 1413 | + RMT_ASSERT(out_resource_update->resource_type == kRmtResourceTypeBuffer); |
| 1414 | + // Buffers should always be cleared with 0xFFFFFFFF. Maybe there is a valid case where this could be something else... |
| 1415 | + RMT_ASSERT(out_resource_update->subresource_id == 0xffffffff); |
| 1416 | + |
| 1417 | + // The DX12 resource transition API provides the state before and after the transition. The driver converts |
| 1418 | + // them to the relevant RMT usage flags and stores them in the 'before' and 'after' fields. |
| 1419 | + // Since we are only concerned with buffers right now, these flags will be of type |
| 1420 | + // RMT_BUFFER_USAGE_FLAGS (aka RmtBufferUsageFlagBits): |
| 1421 | + out_resource_update->before = ReadBitsFromBuffer(data, sizeof(data), 92, 78); |
| 1422 | + out_resource_update->after = ReadBitsFromBuffer(data, sizeof(data), 107, 93); |
| 1423 | + |
| 1424 | + return kRmtOk; |
| 1425 | +} |
| 1426 | + |
1390 | 1427 | RmtErrorCode RmtParserInitialize(RmtParser* rmt_parser,
|
1391 | 1428 | FILE* file_handle,
|
1392 | 1429 | int32_t file_offset,
|
@@ -1541,6 +1578,9 @@ RmtErrorCode RmtParserAdvance(RmtParser* rmt_parser, RmtToken* out_token, RmtPar
|
1541 | 1578 | case kRmtTokenTypeResourceDestroy:
|
1542 | 1579 | error_code = ParseResourceDestroy(rmt_parser, token_header, &out_token->resource_destroy_token);
|
1543 | 1580 | break;
|
| 1581 | + case kRmtTokenTypeResourceUpdate: |
| 1582 | + error_code = ParseResourceUpdate(rmt_parser, token_header, &out_token->resource_update_token); |
| 1583 | + break; |
1544 | 1584 | default:
|
1545 | 1585 | RMT_ASSERT(0);
|
1546 | 1586 | error_code = kRmtErrorMalformedData; // corrupted file.
|
|
0 commit comments