| 10 | using namespace gte; |
| 11 | |
| 12 | DX11Texture3::DX11Texture3(ID3D11Device* device, Texture3 const* texture) |
| 13 | : |
| 14 | DX11TextureSingle(texture) |
| 15 | { |
| 16 | // Specify the texture description. |
| 17 | D3D11_TEXTURE3D_DESC desc; |
| 18 | desc.Width = texture->GetWidth(); |
| 19 | desc.Height = texture->GetHeight(); |
| 20 | desc.Depth = texture->GetThickness(); |
| 21 | desc.MipLevels = texture->GetNumLevels(); |
| 22 | desc.Format = static_cast<DXGI_FORMAT>(texture->GetFormat()); |
| 23 | desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; |
| 24 | desc.MiscFlags = D3D11_RESOURCE_MISC_NONE; |
| 25 | uint32_t usage = texture->GetUsage(); |
| 26 | if (usage == Resource::Usage::IMMUTABLE) |
| 27 | { |
| 28 | desc.Usage = D3D11_USAGE_IMMUTABLE; |
| 29 | desc.CPUAccessFlags = D3D11_CPU_ACCESS_NONE; |
| 30 | } |
| 31 | else if (usage == Resource::Usage::DYNAMIC_UPDATE) |
| 32 | { |
| 33 | desc.Usage = D3D11_USAGE_DYNAMIC; |
| 34 | desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; |
| 35 | } |
| 36 | else // usage == Resource::Usage::SHADER_OUTPUT |
| 37 | { |
| 38 | desc.Usage = D3D11_USAGE_DEFAULT; |
| 39 | desc.BindFlags |= D3D11_BIND_UNORDERED_ACCESS; |
| 40 | desc.CPUAccessFlags = D3D11_CPU_ACCESS_NONE; |
| 41 | } |
| 42 | |
| 43 | if (texture->WantAutogenerateMipmaps()) |
| 44 | { |
| 45 | desc.Usage = D3D11_USAGE_DEFAULT; |
| 46 | desc.BindFlags |= D3D11_BIND_RENDER_TARGET; |
| 47 | desc.CPUAccessFlags = D3D11_CPU_ACCESS_NONE; |
| 48 | desc.MiscFlags |= D3D11_RESOURCE_MISC_GENERATE_MIPS; |
| 49 | } |
| 50 | |
| 51 | // Create the texture. |
| 52 | ID3D11Texture3D* dxTexture = nullptr; |
| 53 | if (texture->GetData()) |
| 54 | { |
| 55 | uint32_t const numSubresources = texture->GetNumSubresources(); |
| 56 | std::vector<D3D11_SUBRESOURCE_DATA> data(numSubresources); |
| 57 | for (uint32_t index = 0; index < numSubresources; ++index) |
| 58 | { |
| 59 | auto sr = texture->GetSubresource(index); |
| 60 | data[index].pSysMem = sr.data; |
| 61 | data[index].SysMemPitch = sr.rowPitch; |
| 62 | data[index].SysMemSlicePitch = sr.slicePitch; |
| 63 | } |
| 64 | DX11Log(device->CreateTexture3D(&desc, &data[0], &dxTexture)); |
| 65 | } |
| 66 | else |
| 67 | { |
| 68 | DX11Log(device->CreateTexture3D(&desc, nullptr, &dxTexture)); |
| 69 | } |
nothing calls this directly
no test coverage detected