Example #1
0
void HelperFuncTable::Init()
{
    if (nEntry == 0) {
        ULONG length = Get1DArrayLength ("hlpFuncTable");
        if (length == 0) {
            return;
        }
        DWORD_PTR hlpAddr = GetAddressOf(offset_class_Global_Variables,
            offset_member_Global_Variables::hlpFuncTable);
        if (hlpAddr == 0) {
            return;
        }
        size_t entrySize = VMHELPDEF::size();
        size_t bufferSize = length*entrySize;
        size_t *buffer = new size_t[bufferSize/sizeof(size_t)];
        if (buffer == NULL) {
            return;
        }
        ToDestroyCxxArray<size_t> des(&buffer);
        if (g_ExtData->ReadVirtual(hlpAddr,buffer,bufferSize,NULL) != S_OK) {
            return;
        }

        EEFLAVOR flavor = GetEEFlavor ();
        ULONG modIndex;
        g_ExtSymbols->GetModuleByOffset(moduleInfo[flavor].baseAddr,0,&modIndex,NULL);
        DEBUG_MODULE_PARAMETERS Params;
        g_ExtSymbols->GetModuleParameters(1,NULL,modIndex,&Params);
        
        size_t index = VMHELPDEF::GetFieldOffset
            (offset_member_VMHELPDEF::pfnHelper)/sizeof(size_t);
        size_t *pt = buffer + entrySize/sizeof(size_t);   // skip the first one
        size_t count = 0;
        size_t i;
        for (i = 1; i < length; i ++) {
            if (pt[index] < Params.Base || pt[index] > Params.Base + Params.Size) {
                count ++;
            }
            pt += entrySize/sizeof(size_t);
        }
        nEntry = count;
        table = new HelperFuncEntry[count];
        count = 0;
        pt = buffer + entrySize/sizeof(size_t);
        for (i = 1; i < length; i ++) {
            if (pt[index] < Params.Base || pt[index] > Params.Base + Params.Size) {
                table[count].addr = hlpAddr + i*entrySize + index*sizeof(size_t);
                table[count].begin = pt[index];
                NameForEnumValue ("CorInfoHelpFunc", i, &table[count].name);
                count ++;
            }
            pt += entrySize/sizeof(size_t);
        }
    }

    SetupAddr();
}
void ComputeShaderSkinning::Dispatch(const Mat bone[BONE_MAX], ID3D11ShaderResourceView* srvPos, ID3D11ShaderResourceView* srvSkin, ID3D11UnorderedAccessView* unorderedAccessView, int nVert)
{
	auto buf = bufferMan.Get(constantBufferId);
	afWriteBuffer(buf, bone, sizeof(BoneBuffer));

	ID3D11ShaderResourceView* srvList[] = {srvPos, srvSkin};
	deviceMan11.GetContext()->CSSetShader(computeShader, nullptr, 0);
	deviceMan11.GetContext()->CSSetConstantBuffers(0, 1, buf.GetAddressOf());
	deviceMan11.GetContext()->CSSetShaderResources(0, 2, srvList);
	deviceMan11.GetContext()->CSSetUnorderedAccessViews(0, 1, &unorderedAccessView, nullptr);

	deviceMan11.GetContext()->Dispatch(nVert, 1, 1);

	ID3D11UnorderedAccessView* nullView = nullptr;
	deviceMan11.GetContext()->CSSetUnorderedAccessViews(0, 1, &nullView, nullptr);
	ID3D11ShaderResourceView* nullTex[] = {nullptr, nullptr};
	deviceMan11.GetContext()->CSSetShaderResources(0, 2, nullTex);
}