@@ -224,6 +224,9 @@ void DxbcConverter::ConvertImpl(_In_reads_bytes_(DxbcSize) LPCVOID pDxbc,
224224 ConvertSignature (*m_pPatchConstantSignature, m_pPR->GetPatchConstOrPrimSignature ());
225225 }
226226
227+ // 3.5. Callback before conversion
228+ PreConvertHook (pByteCode);
229+
227230 // 4. Transform DXBC to DXIL.
228231 Parser.SetShader (pByteCode);
229232 ConvertInstructions (Parser);
@@ -235,6 +238,9 @@ void DxbcConverter::ConvertImpl(_In_reads_bytes_(DxbcSize) LPCVOID pDxbc,
235238 // 6. Cleanup/Optimize DXIL.
236239 Optimize ();
237240
241+ // 7. Callback after conversion
242+ PostConvertHook (pByteCode);
243+
238244 // Serialize DXIL.
239245 SmallVector<char , 4 *1024 > DxilBuffer;
240246 SerializeDxil (DxilBuffer);
@@ -385,6 +391,9 @@ void DxbcConverter::ConvertInDriverImpl(_In_reads_bytes_(8) const UINT32 *pByteC
385391 ConvertSignature (*m_pPatchConstantSignature, m_pPR->GetPatchConstOrPrimSignature ());
386392 }
387393
394+ // 3.5. Callback before conversion
395+ PreConvertHook (pByteCode);
396+
388397 // 4. Transform DXBC to DXIL.
389398 Parser.SetShader (pByteCode);
390399 ConvertInstructions (Parser);
@@ -395,6 +404,9 @@ void DxbcConverter::ConvertInDriverImpl(_In_reads_bytes_(8) const UINT32 *pByteC
395404 // 6. Cleanup/Optimize DXIL.
396405 Optimize ();
397406
407+ // 7. Callback after conversion
408+ PostConvertHook (pByteCode);
409+
398410 // Serialize DXIL.
399411 SmallVector<char , 8 *1024 > DxilBuffer;
400412 raw_svector_ostream DxilStream (DxilBuffer);
@@ -3653,6 +3665,8 @@ void DxbcConverter::ConvertInstructions(D3D10ShaderBinary::CShaderCodeParser &Pa
36533665 // Resource.
36543666 OperandValue InRes;
36553667 LoadOperand (InRes, Inst, uOpUAV, CMask::MakeXMask (), CompType::getInvalid ());
3668+ // SetHasCounter.
3669+ SetHasCounter (Inst, uOpUAV);
36563670
36573671 // Create BufferUpdateCounter call.
36583672 Value *Args[3 ];
@@ -4509,6 +4523,14 @@ void DxbcConverter::LogConvertResult(bool InDriver, _In_ const LARGE_INTEGER *pQ
45094523 // intentionaly empty - override to report conversion results
45104524}
45114525
4526+ HRESULT DxbcConverter::PreConvertHook (const CShaderToken *pByteCode) {
4527+ return S_OK;
4528+ }
4529+
4530+ HRESULT DxbcConverter::PostConvertHook (const CShaderToken *pByteCode) {
4531+ return S_OK;
4532+ }
4533+
45124534void DxbcConverter::HandleUnknownInstruction (D3D10ShaderBinary::CInstruction &Inst) {
45134535 DXASSERT_ARGS (false , " OpCode %u is not yet implemented" , Inst.OpCode ());
45144536}
@@ -5707,6 +5729,18 @@ Value *DxbcConverter::LoadConstFloat(float& fVal) {
57075729 }
57085730}
57095731
5732+ void DxbcConverter::SetHasCounter (D3D10ShaderBinary::CInstruction &Inst, const unsigned uOpUAV) {
5733+ D3D10ShaderBinary::COperandBase &O = Inst.m_Operands [uOpUAV];
5734+ DXASSERT_DXBC (O.m_Type == D3D11_SB_OPERAND_TYPE_UNORDERED_ACCESS_VIEW);
5735+
5736+ // Retrieve UAV range ID and record.
5737+ DXASSERT_DXBC (O.m_IndexType [0 ] == D3D10_SB_OPERAND_INDEX_IMMEDIATE32);
5738+ unsigned RangeID = O.m_Index [0 ].m_RegIndex ;
5739+ unsigned RecIdx = m_UAVRangeMap[RangeID];
5740+ DxilResource &R = m_pPR->GetUAV (RecIdx);
5741+ R.SetHasCounter (true );
5742+ }
5743+
57105744void DxbcConverter::LoadOperand (OperandValue &SrcVal,
57115745 D3D10ShaderBinary::CInstruction &Inst,
57125746 const unsigned OpIdx,
@@ -6365,6 +6399,7 @@ void DxbcConverter::LoadOperand(OperandValue &SrcVal,
63656399 case D3D11_SB_OPERAND_TYPE_INPUT_JOIN_INSTANCE_ID: {
63666400 Scope &HullScope = m_ScopeStack.FindParentHullLoop ();
63676401 Value *pValue = m_pBuilder->CreateLoad (HullScope.pInductionVar );
6402+ pValue = ApplyOperandModifiers (pValue, O);
63686403
63696404 for (OperandValueHelper OVH (SrcVal, Mask, O); !OVH.IsDone (); OVH.Advance ()) {
63706405 OVH.SetValue (pValue);
0 commit comments