示例#1
0
    Error Texture::platformInit(const Config& config)
    {
        ComPtr<ID3D11Resource> d3dResource;

        Renderer::PlatformDetails& plat = ((TextureDx11*)this)->_renderer.getPlatformDetails();
        ID3D11Device* device = plat.device.Get();

        if (config.depth > 0)
        {
            D3D11_TEXTURE3D_DESC desc;
            desc.Width          = config.width;
            desc.Height         = config.height;
            desc.Depth          = config.depth;
            desc.MipLevels      = config.lastMip+1;
            desc.Format         = TranslateToDxgiFormat(config.format);
            desc.BindFlags      = TranslateBindFlags(config.usage, config.format);
            desc.CPUAccessFlags = TranslateCpuAccessFlags(config.usage);
            desc.MiscFlags      = TranslateMiscFlags(config.flags);
            desc.Usage          = TranslateUsage(config.usage);

            HRESULT hr = device->CreateTexture3D(&desc, nullptr, (ID3D11Texture3D**) d3dResource.GetAddressOf());
            if (FAILED(hr))
            {
                EIGEN_RETURN_ERROR("Failed to create volume texture, HRESULT = %d", hr);
            }
        }
        else if (config.height > 0)
        {
            D3D11_TEXTURE2D_DESC desc;
            desc.Width              = config.width;
            desc.Height             = config.height;
            desc.MipLevels          = config.lastMip+1;
            desc.ArraySize          = config.arrayLength > 0 ? config.arrayLength : 1;
            desc.Format             = TranslateToDxgiFormat(config.format);
            desc.SampleDesc.Count   = (UINT)1 << (UINT)config.multisampling;
            desc.SampleDesc.Quality = 0;
            desc.BindFlags          = TranslateBindFlags(config.usage, config.format);
            desc.CPUAccessFlags     = TranslateCpuAccessFlags(config.usage);
            desc.MiscFlags          = TranslateMiscFlags(config.flags);
            desc.Usage              = TranslateUsage(config.usage);

            HRESULT hr = device->CreateTexture2D(&desc, nullptr, (ID3D11Texture2D**) d3dResource.GetAddressOf());
            if (FAILED(hr))
            {
                EIGEN_RETURN_ERROR("Failed to create texture, HRESULT = %d", hr);
            }
        }
        else
        {
            D3D11_TEXTURE1D_DESC desc;
            desc.Width          = config.width;
            desc.MipLevels      = config.lastMip+1;
            desc.ArraySize      = config.arrayLength > 0 ? config.arrayLength : 1;
            desc.Format         = TranslateToDxgiFormat(config.format);
            desc.BindFlags      = TranslateBindFlags(config.usage, config.format);
            desc.CPUAccessFlags = TranslateCpuAccessFlags(config.usage);
            desc.MiscFlags      = TranslateMiscFlags(config.flags);
            desc.Usage          = TranslateUsage(config.usage);

            HRESULT hr = device->CreateTexture1D(&desc, nullptr, (ID3D11Texture1D**) d3dResource.GetAddressOf());
            if (FAILED(hr))
            {
                EIGEN_RETURN_ERROR("Failed to create 1D texture, HRESULT = %d", hr);
            }
        }

        ((TextureDx11*)this)->_d3dResource.Swap(d3dResource);

        EIGEN_RETURN_OK();
    }