| 17 | } |
| 18 | |
| 19 | DX11StructuredBuffer::DX11StructuredBuffer(ID3D11Device* device, StructuredBuffer const* sbuffer) |
| 20 | : |
| 21 | DX11Buffer(sbuffer), |
| 22 | mSRView(nullptr), |
| 23 | mUAView(nullptr), |
| 24 | mCounterStaging(nullptr) |
| 25 | { |
| 26 | // Specify the buffer description. |
| 27 | D3D11_BUFFER_DESC desc; |
| 28 | desc.ByteWidth = sbuffer->GetNumBytes(); |
| 29 | desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; |
| 30 | desc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED; |
| 31 | desc.StructureByteStride = sbuffer->GetElementSize(); |
| 32 | uint32_t usage = sbuffer->GetUsage(); |
| 33 | if (usage == Resource::Usage::IMMUTABLE) |
| 34 | { |
| 35 | desc.Usage = D3D11_USAGE_IMMUTABLE; |
| 36 | desc.CPUAccessFlags = D3D11_CPU_ACCESS_NONE; |
| 37 | } |
| 38 | else if (usage == Resource::Usage::DYNAMIC_UPDATE) |
| 39 | { |
| 40 | desc.Usage = D3D11_USAGE_DYNAMIC; |
| 41 | desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; |
| 42 | } |
| 43 | else // usage == Resource::Usage::SHADER_OUTPUT |
| 44 | { |
| 45 | desc.Usage = D3D11_USAGE_DEFAULT; |
| 46 | desc.BindFlags |= D3D11_BIND_UNORDERED_ACCESS; |
| 47 | desc.CPUAccessFlags = D3D11_CPU_ACCESS_NONE; |
| 48 | } |
| 49 | |
| 50 | // Create the buffer. |
| 51 | ID3D11Buffer* buffer = nullptr; |
| 52 | if (sbuffer->GetData()) |
| 53 | { |
| 54 | D3D11_SUBRESOURCE_DATA data; |
| 55 | data.pSysMem = sbuffer->GetData(); |
| 56 | data.SysMemPitch = 0; |
| 57 | data.SysMemSlicePitch = 0; |
| 58 | DX11Log(device->CreateBuffer(&desc, &data, &buffer)); |
| 59 | } |
| 60 | else |
| 61 | { |
| 62 | DX11Log(device->CreateBuffer(&desc, nullptr, &buffer)); |
| 63 | } |
| 64 | mDXObject = buffer; |
| 65 | |
| 66 | // Create views of the buffer. |
| 67 | CreateSRView(device); |
| 68 | if (usage == Resource::Usage::SHADER_OUTPUT) |
| 69 | { |
| 70 | CreateUAView(device); |
| 71 | } |
| 72 | |
| 73 | // Create a staging buffer if requested. |
| 74 | if (sbuffer->GetCopy() != Resource::Copy::NONE) |
| 75 | { |
| 76 | CreateStaging(device, desc); |
nothing calls this directly
no test coverage detected