Dryad/GraphManager/vertex/DrVertexCommand.cpp

964 lines
25 KiB
C++

/*
Copyright (c) Microsoft Corporation
All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in
compliance with the License. You may obtain a copy of the License
at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER
EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF
TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions and
limitations under the License.
*/
#include <DrVertexHeaders.h>
static const char* s_StatusPropertyLabel = "DVertexStatus";
static const char* s_CommandPropertyLabel = "DVertexCommand";
DrChannelDescription::DrChannelDescription(bool isInputChannel)
{
m_state = DrError_ChannelAbort;
m_errorCode = S_OK;
m_totalLength = 0;
m_processedLength = 0;
m_isInputChannel = isInputChannel;
}
DrChannelDescription::~DrChannelDescription()
{
}
HRESULT DrChannelDescription::GetChannelState()
{
return m_state;
}
void DrChannelDescription::SetChannelState(HRESULT state)
{
m_state = state;
}
DrString DrChannelDescription::GetChannelURI()
{
return m_URI;
}
void DrChannelDescription::SetChannelURI(DrString channelURI)
{
m_URI = channelURI;
}
DrMetaDataPtr DrChannelDescription::GetChannelMetaData()
{
return m_metaData;
}
void DrChannelDescription::SetChannelMetaData(DrMetaDataPtr metaData)
{
m_metaData = metaData;
}
HRESULT DrChannelDescription::GetChannelErrorCode()
{
return m_errorCode;
}
void DrChannelDescription::SetChannelErrorCode(HRESULT errorCode)
{
m_errorCode = errorCode;
}
DrString DrChannelDescription::GetChannelErrorString()
{
return m_errorString;
}
void DrChannelDescription::SetChannelErrorString(DrString errorString)
{
m_errorString = errorString;
}
UINT64 DrChannelDescription::GetChannelTotalLength()
{
return m_totalLength;
}
void DrChannelDescription::SetChannelTotalLength(UINT64 totalLength)
{
m_totalLength = totalLength;
}
UINT64 DrChannelDescription::GetChannelProcessedLength()
{
return m_processedLength;
}
void DrChannelDescription::SetChannelProcessedLength(UINT64 processedLength)
{
m_processedLength = processedLength;
}
void DrChannelDescription::Serialize(DrPropertyWriterPtr writer)
{
UINT16 tagValue = (m_isInputChannel) ?
DrTag_InputChannelDescription :
DrTag_OutputChannelDescription;
writer->WriteProperty(DrProp_BeginTag, tagValue);
writer->WriteProperty(DrProp_ChannelState, m_state);
writer->WriteProperty(DrProp_ChannelURI, m_URI);
writer->WriteProperty(DrProp_ChannelTotalLength, m_totalLength);
writer->WriteProperty(DrProp_ChannelProcessedLength, m_processedLength);
if (m_metaData != DrNull)
{
writer->WriteProperty(DrProp_BeginTag, DrTag_ChannelMetaData);
m_metaData->Serialize(writer);
writer->WriteProperty(DrProp_EndTag, DrTag_ChannelMetaData);
}
if (m_errorCode != S_OK)
{
writer->WriteProperty(DrProp_ChannelErrorCode, m_errorCode);
}
if (m_errorString.GetChars() != NULL)
{
writer->WriteProperty(DrProp_ChannelErrorString, m_errorString);
}
writer->WriteProperty(DrProp_EndTag, tagValue);
}
HRESULT DrChannelDescription::ParseProperty(DrPropertyReaderPtr reader,
UINT16 enumID, UINT32 /* unused dataLen */)
{
HRESULT err;
switch (enumID)
{
default:
DrLogW("Unknown property in channel description enumID %u", (UINT32) enumID);
err = reader->SkipNextPropertyOrAggregate();
break;
case DrProp_ChannelState:
err = reader->ReadNextProperty(enumID, m_state);
break;
case DrProp_ChannelURI:
{
DrString URI;
err = reader->ReadNextProperty(enumID, URI);
if (err == S_OK)
{
SetChannelURI(URI);
}
}
break;
case DrProp_ChannelErrorCode:
err = reader->ReadNextProperty(enumID, m_errorCode);
break;
case DrProp_ChannelErrorString:
{
DrString errorString;
err = reader->ReadNextProperty(enumID, errorString);
if (err == S_OK)
{
SetChannelErrorString(errorString);
}
}
break;
case DrProp_ChannelTotalLength:
err = reader->ReadNextProperty(enumID, m_totalLength);
break;
case DrProp_ChannelProcessedLength:
err = reader->ReadNextProperty(enumID, m_processedLength);
break;
case DrProp_BeginTag:
{
UINT16 tagID;
err = reader->PeekNextAggregateTag(&tagID);
if (err == S_OK)
{
if (tagID == DrTag_ChannelMetaData)
{
DrMetaDataRef mData = DrNew DrMetaData();
err = reader->ReadAggregate(tagID, mData);
if (err == S_OK)
{
SetChannelMetaData(mData);
}
}
else
{
DrLogW("Unknown aggregate in channel description tagID %u", (UINT32) tagID);
}
}
}
break;
}
return err;
}
void DrChannelDescription::CopyFrom(DrChannelDescriptionPtr src, bool includeLengths)
{
DrAssert(m_isInputChannel == src->m_isInputChannel);
SetChannelURI(src->GetChannelURI());
SetChannelState(src->GetChannelState());
SetChannelMetaData(src->GetChannelMetaData());
SetChannelErrorCode(src->GetChannelErrorCode());
SetChannelErrorString(src->GetChannelErrorString());
if (includeLengths)
{
SetChannelProcessedLength(src->GetChannelProcessedLength());
SetChannelTotalLength(src->GetChannelTotalLength());
}
}
DrInputChannelDescription::DrInputChannelDescription() :
DrChannelDescription(true)
{
}
DrOutputChannelDescription::DrOutputChannelDescription() :
DrChannelDescription(false)
{
}
DrVertexProcessStatus::DrVertexProcessStatus()
{
m_id = 0;
m_version = 0;
m_errorCode = S_OK;
m_maxInputChannels = 0;
m_maxOutputChannels = 0;
m_canShareWorkQueue = false;
m_nextInputChannelToRead = 0;
m_nextOutputChannelToRead = 0;
}
int DrVertexProcessStatus::GetVertexId()
{
return m_id;
}
void DrVertexProcessStatus::SetVertexId(int vertexId)
{
m_id = vertexId;
}
int DrVertexProcessStatus::GetVertexInstanceVersion()
{
return m_version;
}
void DrVertexProcessStatus::SetVertexInstanceVersion(int version)
{
m_version = version;
}
DrMetaDataPtr DrVertexProcessStatus::GetVertexMetaData()
{
return m_metaData;
}
void DrVertexProcessStatus::SetVertexMetaData(DrMetaDataPtr metaData)
{
m_metaData = metaData;
}
HRESULT DrVertexProcessStatus::GetVertexErrorCode()
{
return m_errorCode;
}
void DrVertexProcessStatus::SetVertexErrorCode(HRESULT errorCode)
{
m_errorCode = errorCode;
}
DrString DrVertexProcessStatus::GetVertexErrorString()
{
return m_errorString;
}
void DrVertexProcessStatus::SetVertexErrorString(DrString errorString)
{
m_errorString = errorString;
}
DrInputChannelArrayRef DrVertexProcessStatus::GetInputChannels()
{
return m_inputChannel;
}
void DrVertexProcessStatus::SetInputChannelCount(int nInputChannels)
{
DrAssert(nInputChannels >= 0);
m_inputChannel = DrNew DrInputChannelArray(nInputChannels);
int i;
for (i=0; i<nInputChannels; ++i)
{
m_inputChannel[i] = DrNew DrInputChannelDescription();
}
m_nextInputChannelToRead = 0;
}
int DrVertexProcessStatus::GetMaxOpenInputChannelCount()
{
return m_maxInputChannels;
}
void DrVertexProcessStatus::SetMaxOpenInputChannelCount(int channelCount)
{
DrAssert(channelCount >= 0);
m_maxInputChannels = channelCount;
}
DrOutputChannelArrayRef DrVertexProcessStatus::GetOutputChannels()
{
return m_outputChannel;
}
void DrVertexProcessStatus::SetOutputChannelCount(int nOutputChannels)
{
DrAssert(nOutputChannels >= 0);
m_outputChannel = DrNew DrOutputChannelArray(nOutputChannels);
int i;
for (i=0; i<nOutputChannels; ++i)
{
m_outputChannel[i] = DrNew DrOutputChannelDescription();
}
m_nextOutputChannelToRead = 0;
}
int DrVertexProcessStatus::GetMaxOpenOutputChannelCount()
{
return m_maxOutputChannels;
}
void DrVertexProcessStatus::SetMaxOpenOutputChannelCount(int channelCount)
{
DrAssert(channelCount >= 0);
m_maxOutputChannels = channelCount;
}
bool DrVertexProcessStatus::GetCanShareWorkQueue()
{
return m_canShareWorkQueue;
}
void DrVertexProcessStatus::SetCanShareWorkQueue(bool canShareWorkQueue)
{
m_canShareWorkQueue = canShareWorkQueue;
}
void DrVertexProcessStatus::Serialize(DrPropertyWriterPtr writer)
{
int i;
writer->WriteProperty(DrProp_BeginTag, DrTag_VertexProcessStatus);
writer->WriteProperty(DrProp_VertexId, (UINT32) m_id);
writer->WriteProperty(DrProp_VertexVersion, (UINT32) m_version);
if (m_metaData != DrNull)
{
writer->WriteProperty(DrProp_BeginTag, DrTag_VertexMetaData);
m_metaData->Serialize(writer);
writer->WriteProperty(DrProp_EndTag, DrTag_VertexMetaData);
}
if (m_errorCode != S_OK)
{
writer->WriteProperty(DrProp_VertexErrorCode, m_errorCode);
}
if (m_errorString.GetChars() != NULL)
{
writer->WriteProperty(DrProp_VertexErrorString, m_errorString);
}
if (m_inputChannel == DrNull)
{
writer->WriteProperty(DrProp_VertexInputChannelCount, (UINT32) 0);
}
else
{
writer->WriteProperty(DrProp_VertexInputChannelCount, (UINT32) m_inputChannel->Allocated());
for (i=0; i<m_inputChannel->Allocated(); ++i)
{
m_inputChannel[i]->Serialize(writer);
}
}
writer->WriteProperty(DrProp_VertexMaxOpenInputChannelCount, (UINT32) m_maxInputChannels);
if (m_outputChannel == DrNull)
{
writer->WriteProperty(DrProp_VertexOutputChannelCount, (UINT32) 0);
}
else
{
writer->WriteProperty(DrProp_VertexOutputChannelCount, (UINT32) m_outputChannel->Allocated());
for (i=0; i<m_outputChannel->Allocated(); ++i)
{
m_outputChannel[i]->Serialize(writer);
}
}
writer->WriteProperty(DrProp_VertexMaxOpenOutputChannelCount, (UINT32) m_maxOutputChannels);
writer->WriteProperty(DrProp_CanShareWorkQueue, m_canShareWorkQueue);
writer->WriteProperty(DrProp_EndTag, DrTag_VertexProcessStatus);
}
HRESULT DrVertexProcessStatus::ParseProperty(DrPropertyReaderPtr reader,
UINT16 enumID, UINT32 /* unused dataLen */)
{
HRESULT err;
switch (enumID)
{
default:
DrLogW("Unknown property in vertex status message enumID %u", (UINT32) enumID);
err = reader->SkipNextPropertyOrAggregate();
break;
case DrProp_VertexId:
UINT32 id;
err = reader->ReadNextProperty(enumID, id);
if (err == S_OK)
{
if (id >= 0x80000000)
{
DrLogW("Vertex ID out of range %u", id);
err = HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER);
}
else
{
m_id = id;
}
}
break;
case DrProp_VertexVersion:
UINT32 version;
err = reader->ReadNextProperty(enumID, version);
if (err == S_OK)
{
if (version >= 0x80000000)
{
DrLogW("Vertex version out of range %u", version);
err = HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER);
}
else
{
m_version = version;
}
}
break;
case DrProp_VertexErrorCode:
err = reader->ReadNextProperty(enumID, m_errorCode);
break;
case DrProp_VertexErrorString:
{
DrString errorString;
err = reader->ReadNextProperty(enumID, errorString);
if (err == S_OK)
{
SetVertexErrorString(errorString);
}
}
break;
case DrProp_VertexInputChannelCount:
UINT32 nInputChannels;
err = reader->ReadNextProperty(enumID, nInputChannels);
if (err == S_OK)
{
if (nInputChannels >= 0x80000000)
{
DrLogW("Too many input channels %u", nInputChannels);
err = HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER);
}
else
{
SetInputChannelCount((int) nInputChannels);
}
}
break;
case DrProp_VertexMaxOpenInputChannelCount:
UINT32 maxInputChannels;
err = reader->ReadNextProperty(enumID, maxInputChannels);
if (err == S_OK)
{
if (maxInputChannels >= 0x80000000)
{
DrLogW("Too many max input channels %u", maxInputChannels);
err = HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER);
}
else
{
m_maxInputChannels = (int) maxInputChannels;
}
}
break;
case DrProp_VertexOutputChannelCount:
UINT32 nOutputChannels;
err = reader->ReadNextProperty(enumID, nOutputChannels);
if (err == S_OK)
{
if (nOutputChannels >= 0x80000000)
{
DrLogW("Too many output channels %u", nOutputChannels);
err = HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER);
}
else
{
SetOutputChannelCount((int) nOutputChannels);
}
}
break;
case DrProp_VertexMaxOpenOutputChannelCount:
UINT32 maxOutputChannels;
err = reader->ReadNextProperty(enumID, maxOutputChannels);
if (err == S_OK)
{
if (maxOutputChannels >= 0x80000000)
{
DrLogW("Too many max output channels %d", maxOutputChannels);
err = HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER);
}
else
{
m_maxOutputChannels = (int) maxOutputChannels;
}
}
break;
case DrProp_CanShareWorkQueue:
err = reader->ReadNextProperty(enumID, m_canShareWorkQueue);
break;
case DrProp_BeginTag:
UINT16 tagValue;
err = reader->PeekNextAggregateTag(&tagValue);
if (err != S_OK)
{
DrLogW("Error reading DrProp_BeginTag %d", err);
}
else
{
switch (tagValue)
{
case DrTag_InputChannelDescription:
if (m_nextInputChannelToRead >= m_inputChannel->Allocated())
{
DrLogW("Too many input channel descriptions nextInputChannelToRead=%d, nInputChannels=%d",
m_nextInputChannelToRead, m_inputChannel->Allocated());
err = HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER);
}
else
{
err = reader->ReadAggregate(tagValue, m_inputChannel[m_nextInputChannelToRead]);
if (err == S_OK)
{
++m_nextInputChannelToRead;
}
}
break;
case DrTag_OutputChannelDescription:
if (m_nextOutputChannelToRead >= m_outputChannel->Allocated())
{
DrLogW("Too many output channel descriptions nextOutputChannelToRead=%d, nOutputChannels=%d",
m_nextOutputChannelToRead, m_outputChannel->Allocated());
err = HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER);
}
else
{
err = reader->ReadAggregate(tagValue, m_outputChannel[m_nextOutputChannelToRead]);
if (err == S_OK)
{
++m_nextOutputChannelToRead;
}
}
break;
case DrTag_VertexMetaData:
{
DrMetaDataRef metaData = DrNew DrMetaData();
err = reader->ReadAggregate(tagValue, metaData);
if (err == S_OK)
{
m_metaData = metaData;
}
}
break;
default:
DrLogW("Unexpected tag %d", tagValue);
err = reader->SkipNextPropertyOrAggregate();
}
}
break;
}
return err;
}
void DrVertexProcessStatus::CopyFrom(DrVertexProcessStatusPtr src,
bool includeLengths)
{
int i;
SetVertexId(src->GetVertexId());
SetVertexInstanceVersion(src->GetVertexInstanceVersion());
SetVertexMetaData(src->GetVertexMetaData());
SetVertexErrorCode(src->GetVertexErrorCode());
SetVertexErrorString(src->GetVertexErrorString());
SetInputChannelCount(src->GetInputChannels()->Allocated());
DrInputChannelArrayRef srcInputs = src->GetInputChannels();
for (i=0; i<m_inputChannel->Allocated(); ++i)
{
m_inputChannel[i]->CopyFrom(srcInputs[i], includeLengths);
}
SetMaxOpenInputChannelCount(src->GetMaxOpenInputChannelCount());
SetOutputChannelCount(src->GetOutputChannels()->Allocated());
DrOutputChannelArrayRef srcOutputs = src->GetOutputChannels();
for (i=0; i<m_outputChannel->Allocated(); ++i)
{
m_outputChannel[i]->CopyFrom(srcOutputs[i], includeLengths);
}
SetMaxOpenOutputChannelCount(src->GetMaxOpenOutputChannelCount());
}
DrVertexStatus::DrVertexStatus()
{
m_state = S_OK;
m_processStatus = DrNew DrVertexProcessStatus();
}
HRESULT DrVertexStatus::GetVertexState()
{
return m_state;
}
void DrVertexStatus::SetVertexState(HRESULT state)
{
m_state = state;
}
DrVertexProcessStatusPtr DrVertexStatus::GetProcessStatus()
{
return m_processStatus;
}
void DrVertexStatus::SetProcessStatus(DrVertexProcessStatusPtr processStatus)
{
m_processStatus = processStatus;
}
void DrVertexStatus::Serialize(DrPropertyWriterPtr writer)
{
writer->WriteProperty(DrProp_BeginTag, DrTag_VertexStatus);
writer->WriteProperty(DrProp_VertexState, m_state);
m_processStatus->Serialize(writer);
writer->WriteProperty(DrProp_EndTag, DrTag_VertexStatus);
}
HRESULT DrVertexStatus::ParseProperty(DrPropertyReaderPtr reader, UINT16 enumID,
UINT32 /* unused dataLen */)
{
HRESULT err;
switch (enumID)
{
default:
DrLogW("Unknown property in vertex status message enumID %u", (UINT32) enumID);
err = reader->SkipNextPropertyOrAggregate();
break;
case DrProp_VertexState:
err = reader->ReadNextProperty(enumID, m_state);
break;
case DrProp_BeginTag:
UINT16 tagValue;
err = reader->PeekNextAggregateTag(&tagValue);
if (err != S_OK)
{
DrLogW("Error reading DrProp_BeginTag %d", err);
}
else
{
switch (tagValue)
{
case DrTag_VertexProcessStatus:
err = reader->ReadAggregate(tagValue, m_processStatus);
break;
default:
DrLogW("Unexpected tag %d", tagValue);
err = reader->SkipNextPropertyOrAggregate();
}
}
break;
}
return err;
}
DrString DrVertexStatus::GetPropertyLabel(int vertexId, int vertexVersion)
{
DrString s;
s.SetF("%s-%d.%d", s_StatusPropertyLabel, vertexId, vertexVersion);
return s;
}
DrVertexCommandBlock::DrVertexCommandBlock()
{
m_command = DrVC_Terminate;
m_processStatus = DrNew DrVertexProcessStatus();
m_setBreakpointOnCommandArrival = false;
m_nextArgumentToRead = 0;
}
DrVertexCommand DrVertexCommandBlock::GetVertexCommand()
{
return m_command;
}
void DrVertexCommandBlock::SetVertexCommand(DrVertexCommand command)
{
m_command = command;
}
DrVertexProcessStatusPtr DrVertexCommandBlock::GetProcessStatus()
{
return m_processStatus;
}
void DrVertexCommandBlock::SetProcessStatus(DrVertexProcessStatusPtr processStatus)
{
m_processStatus = processStatus;
}
void DrVertexCommandBlock::SetArgumentCount(int nArguments)
{
m_argument = DrNew DrStringArray(nArguments);
m_nextArgumentToRead = 0;
}
DrStringArrayRef DrVertexCommandBlock::GetArgumentVector()
{
return m_argument;
}
DrByteArrayPtr DrVertexCommandBlock::GetRawSerializedBlock()
{
return m_serializedBlock;
}
void DrVertexCommandBlock::SetRawSerializedBlock(DrByteArrayPtr block)
{
m_serializedBlock = block;
}
void DrVertexCommandBlock::SetDebugBreak(bool setBreakpointOnCommandArrival)
{
m_setBreakpointOnCommandArrival = setBreakpointOnCommandArrival;
}
bool DrVertexCommandBlock::GetDebugBreak()
{
return m_setBreakpointOnCommandArrival;
}
void DrVertexCommandBlock::Serialize(DrPropertyWriterPtr writer)
{
int i;
writer->WriteProperty(DrProp_BeginTag, DrTag_VertexCommand);
writer->WriteProperty(DrProp_VertexCommand, (UINT32) m_command);
m_processStatus->Serialize(writer);
if (m_argument == DrNull)
{
writer->WriteProperty(DrProp_VertexArgumentCount, 0);
}
else
{
writer->WriteProperty(DrProp_VertexArgumentCount, (UINT32) m_argument->Allocated());
for (i=0; i<m_argument->Allocated(); ++i)
{
writer->WriteProperty(DrProp_VertexArgument, m_argument[i]);
}
}
if (m_serializedBlock != DrNull)
{
DRPIN(BYTE) block = &(m_serializedBlock[0]);
writer->WriteProperty(DrProp_VertexSerializedBlock, m_serializedBlock->Allocated(), block);
}
writer->WriteProperty(DrProp_DebugBreak, m_setBreakpointOnCommandArrival);
writer->WriteProperty(DrProp_EndTag, DrTag_VertexCommand);
}
HRESULT DrVertexCommandBlock::ParseProperty(DrPropertyReaderPtr reader, UINT16 enumID,
UINT32 /* unused dataLen */)
{
HRESULT err;
switch (enumID)
{
default:
DrLogW("Unknown property in vertex command message enumID %u", (UINT32) enumID);
err = reader->SkipNextPropertyOrAggregate();
break;
case DrProp_VertexCommand:
UINT32 marshaledCommand;
err = reader->ReadNextProperty(enumID, marshaledCommand);
if (err == S_OK)
{
if (marshaledCommand < DrVC_Max)
{
m_command = (DrVertexCommand) marshaledCommand;
}
else
{
DrLogW("Unknown vertex command %u", marshaledCommand);
err = HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER);
}
}
break;
case DrProp_VertexArgumentCount:
UINT32 nArguments;
err = reader->ReadNextProperty(enumID, nArguments);
if (err == S_OK)
{
if (nArguments < 0x80000000)
{
SetArgumentCount((int) nArguments);
}
else
{
DrLogW("Too large argument count %u", nArguments);
err = HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER);
}
}
break;
case DrProp_VertexArgument:
if (m_nextArgumentToRead >= m_argument->Allocated())
{
DrLogW("Too many arguments nextArgumentToRead=%d, nArguments=%d",
m_nextArgumentToRead, m_argument->Allocated());
err = HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER);
}
else
{
DrString arg;
err = reader->ReadNextProperty(enumID, arg);
if (err == S_OK)
{
m_argument[m_nextArgumentToRead] = arg;
++m_nextArgumentToRead;
}
}
break;
case DrProp_VertexSerializedBlock:
UINT32 blockLength;
err = reader->PeekNextPropertyTag(&enumID, &blockLength);
if (err == S_OK)
{
if (blockLength < 0x80000000)
{
DrByteArrayRef block = DrNew DrByteArray((int) blockLength);
{
DRPIN(BYTE) data = &(block[0]);
err = reader->ReadNextProperty(enumID, (UINT32) blockLength, data);
}
if (err == S_OK)
{
m_serializedBlock = block;
}
}
else
{
DrLogW("Block too large %u", blockLength);
err = HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER);
}
}
break;
case DrProp_DebugBreak:
err = reader->ReadNextProperty(enumID, m_setBreakpointOnCommandArrival);
break;
case DrProp_BeginTag:
UINT16 tagValue;
err = reader->PeekNextAggregateTag(&tagValue);
if (err != S_OK)
{
DrLogW("Error reading DrProp_BeginTag %d", err);
}
else
{
switch (tagValue)
{
case DrTag_VertexProcessStatus:
err = reader->ReadAggregate(tagValue, m_processStatus);
break;
default:
DrLogW("Unexpected tag %d", tagValue);
err = reader->SkipNextPropertyOrAggregate();
}
}
break;
}
return err;
}
DrString DrVertexCommandBlock::GetPropertyLabel(int vertexId, int vertexVersion)
{
DrString s;
s.SetF("%s-%d.%d", s_CommandPropertyLabel, vertexId, vertexVersion);
return s;
}