Sagen wir, ichWie kann ich in den Puffer meiner ID3D11UnorderedAccessView schreiben, bevor ich meinen Shader abschicke?
ID3D11UnorderedAccessView* pDataView
haben, und ich habe
byte* pRawData
wie kann ich pDataView Puffer mit pRawData eingestellt?
HINWEIS: FAILED und CHR sind Fehlerprüfmakros.
UPDATE: Soonts gab eine Antwort, die den Trick zu erstellen scheint, wenn ich das UAV erstelle, aber im Interesse der Vollständigkeit möchte ich auch in der Lage sein, seinen Puffer erfolgreich von der CPU zu aktualisieren erstellt. Ich war nicht so erfolgreich, das zu versuchen. Wenn ich habe:
template <typename T>
static inline void CreateUnorderedAccessViewFromFile(
_In_ ID3D11Device* pDevice,
_In_ ID3D11DeviceContext* pDeviceContext,
_In_ HANDLE dataFile,
_Out_ ID3D11Buffer** ppBuffer,
_Out_ ID3D11UnorderedAccessView** ppUav)
{
uint64_t fileSize;
//CBR(::GetFileSizeEx(handle, &fileSize));
//Custom size for testing purposes
fileSize = 0x800;
D3D11_BUFFER_DESC bufferDesc =
{
fileSize, // ByteWidth
D3D11_USAGE_DEFAULT, // Usage
D3D11_BIND_UNORDERED_ACCESS, // BindFlags
D3D11_CPU_ACCESS_WRITE, // CPUAccessFlags
D3D11_RESOURCE_MISC_BUFFER_STRUCTURED, // MiscFlags
sizeof(T), // StructureByteStride
};
CHR(pDevice->CreateBuffer(
&bufferDesc,
nullptr,
ppBuffer));
D3D11_MAPPED_SUBRESOURCE mappedResource;
HRESULT hr = pDeviceContext->Map(
*ppBuffer,
0,
D3D11_MAP_WRITE_DISCARD,
0,
&mappedResource);
byte* ppData = reinterpret_cast<byte*>(mappedResource.pData);
for (uint64_t i = 0; i < fileSize; i += 0x10000)
{
DWORD readSize = min(fileSize - i, 0x10000);
if (!ReadFile(
dataFile,
ppData,
readSize,
NULL,
NULL))
{
uint32_t lastError = ::GetLastError();
CBR(lastError != ERROR_IO_PENDING);
}
}
pDeviceContext->Unmap(
*ppBuffer,
0);
D3D11_UNORDERED_ACCESS_VIEW_DESC uaView =
{
DXGI_FORMAT_UNKNOWN, // Format
D3D11_UAV_DIMENSION_BUFFER, // ViewDimension
};
uaView.Buffer.FirstElement = 0;
uaView.Buffer.Flags = 0;
uaView.Buffer.NumElements = fileSize/sizeof(T);
CHR(pDevice->CreateUnorderedAccessView(
*ppBuffer,
&uaView,
ppUav));
}
Warum könnte ich hr E_INVALIDARG auf der Karte sein?
Hinweis: FAILED und CHR sind Fehlerprüfungsmakros.
Eine beschreibbare CPU-Ressource kann die uav-Bindung nicht verwenden, da sie auf dem PC in Konflikt stehen. Sie müssen einen separaten Puffer behalten und eine Kopie verwenden – galop1n
@Soonts Ich konnte es so machen, wie Sie beim Erstellen der UAV mit Daten beschrieben, aber war nicht so erfolgreich bei der Aktualisierung der UAV-Puffer, nachdem es erstellt wurde. Könnten Sie einen Blick darauf werfen und vorschlagen, was schief gehen könnte? – MNagy
@MNagy ein anderes Update sehen – Soonts