| 67 | } |
| 68 | |
| 69 | bool GPUBufferDX11::OnInit() |
| 70 | { |
| 71 | bool useSRV = IsShaderResource(); |
| 72 | bool useUAV = IsUnorderedAccess(); |
| 73 | |
| 74 | // Create buffer description |
| 75 | D3D11_BUFFER_DESC bufferDesc; |
| 76 | bufferDesc.ByteWidth = _desc.Size; |
| 77 | bufferDesc.Usage = RenderToolsDX::ToD3D11Usage(_desc.Usage); |
| 78 | bufferDesc.BindFlags = 0; |
| 79 | bufferDesc.CPUAccessFlags = RenderToolsDX::GetDX11CpuAccessFlagsFromUsage(_desc.Usage); |
| 80 | bufferDesc.MiscFlags = 0; |
| 81 | bufferDesc.StructureByteStride = 0; |
| 82 | if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::VertexBuffer)) |
| 83 | bufferDesc.BindFlags |= D3D11_BIND_VERTEX_BUFFER; |
| 84 | if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::IndexBuffer)) |
| 85 | bufferDesc.BindFlags |= D3D11_BIND_INDEX_BUFFER; |
| 86 | if (useSRV) |
| 87 | bufferDesc.BindFlags |= D3D11_BIND_SHADER_RESOURCE; |
| 88 | if (useUAV) |
| 89 | bufferDesc.BindFlags |= D3D11_BIND_UNORDERED_ACCESS; |
| 90 | |
| 91 | if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::Argument)) |
| 92 | bufferDesc.MiscFlags |= D3D11_RESOURCE_MISC_DRAWINDIRECT_ARGS; |
| 93 | if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::RawBuffer)) |
| 94 | bufferDesc.MiscFlags |= D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS; |
| 95 | if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::Structured)) |
| 96 | { |
| 97 | bufferDesc.MiscFlags |= D3D11_RESOURCE_MISC_BUFFER_STRUCTURED; |
| 98 | bufferDesc.StructureByteStride = _desc.Stride; |
| 99 | } |
| 100 | |
| 101 | // Create resource |
| 102 | D3D11_SUBRESOURCE_DATA data; |
| 103 | if (_desc.InitData) |
| 104 | { |
| 105 | data.pSysMem = _desc.InitData; |
| 106 | data.SysMemPitch = bufferDesc.ByteWidth; |
| 107 | data.SysMemSlicePitch = 0; |
| 108 | } |
| 109 | VALIDATE_DIRECTX_CALL(_device->GetDevice()->CreateBuffer(&bufferDesc, _desc.InitData ? &data : nullptr, &_resource)); |
| 110 | |
| 111 | // Set state |
| 112 | DX_SET_DEBUG_NAME(_resource, GetName()); |
| 113 | _memoryUsage = _desc.Size; |
| 114 | int32 numElements = _desc.GetElementsCount(); |
| 115 | |
| 116 | // Create views |
| 117 | if (useSRV) |
| 118 | { |
| 119 | D3D11_SHADER_RESOURCE_VIEW_DESC srvDesc; |
| 120 | if (EnumHasAnyFlags(_desc.Flags, GPUBufferFlags::RawBuffer)) |
| 121 | { |
| 122 | srvDesc.Format = DXGI_FORMAT_R32_TYPELESS; |
| 123 | srvDesc.ViewDimension = D3D11_SRV_DIMENSION_BUFFEREX; |
| 124 | srvDesc.BufferEx.FirstElement = 0; |
| 125 | srvDesc.BufferEx.NumElements = numElements; |
| 126 | srvDesc.BufferEx.Flags = D3D11_BUFFEREX_SRV_FLAG_RAW; |
nothing calls this directly
no test coverage detected