Example #1
0
	//------------------------------------------------------------------------------------
	D3D11Texture::D3D11Texture(uint32 width, uint32 height, uint32 depth, ePixelFormat format, uint32 usage, bool bMipMap)
		: Texture(eTextureType_3D, width, height, depth, format, usage, bMipMap)
		, m_pTexture2D(nullptr)
		, m_pTexture3D(nullptr)
		, m_pRTV(nullptr)
		, m_pSRV(nullptr)
		, m_pDSV(nullptr)
		, m_pTexStaging(nullptr)
	{
		ZeroMemory(m_pRTV_slices, sizeof(m_pRTV_slices));

		HRESULT hr = S_OK;
		const DXGI_FORMAT dxformat = ConvertToDXFormat(m_texFormat);

		CD3D11_TEXTURE3D_DESC desc(dxformat, width, height, depth, 1);

		// Validate usage
		_AST(!((m_usage&eTextureUsage_WriteOnly) && (m_usage&eTextureUsage_ReadWrite)) && "Invalid usage!");

		// Assign usage
		if (m_usage & eTextureUsage_WriteOnly)
		{
			desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
			desc.Usage = D3D11_USAGE_DYNAMIC;
		}
		else if (m_usage & eTextureUsage_ReadWrite)
		{
			desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE | D3D11_CPU_ACCESS_READ;
			desc.Usage = D3D11_USAGE_STAGING;
			desc.BindFlags = 0;
		}

		if (m_usage & eTextureUsage_RenderTarget)
		{
			desc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
		}

		V(g_pRenderSys->GetDevice()->CreateTexture3D(&desc, nullptr, &m_pTexture3D));

		CreateSRV();

		// Create RTV
		if (m_usage & eTextureUsage_RenderTarget)
		{
			_AST(depth <= 32);

			for (uint32 i = 0; i < depth; ++i)
			{
				CD3D11_RENDER_TARGET_VIEW_DESC rtvDesc(D3D11_RTV_DIMENSION_TEXTURE3D, dxformat, 0, i, 1);
				V(g_pRenderSys->GetDevice()->CreateRenderTargetView(m_pTexture3D, &rtvDesc, &m_pRTV_slices[i]));
			}
		}
	}
Example #2
0
void DX11Engine::createSwapChainRenderTargets(IUnknown** ppRTV, IUnknown** ppRTVsRGB, 
    IUnknown** ppDSV, IUnknown* pNativeDevice, IUnknown* pSwapChainIn, 
    size_t length, const char* debugName) const
{
    auto pSwapChain = reinterpret_cast<IDXGISwapChain*>(pSwapChainIn);
    auto pDevice = reinterpret_cast<ID3D11Device*>(pNativeDevice);
        
    HRESULT hr = S_OK;
    std::unique_ptr<ID3D11Texture2D, COMDeleter> pD3D11Texture;
        
    // rtv
    DXGI_SWAP_CHAIN_DESC desc;
    V(pSwapChain->GetDesc(&desc));
    V(pSwapChain->GetBuffer(0, __uuidof(ID3D11Texture2D), ref(pD3D11Texture)));
    STAR_SET_DEBUG_NAME(pD3D11Texture, length, debugName);

    CD3D11_RENDER_TARGET_VIEW_DESC rtvDesc(D3D11_RTV_DIMENSION_TEXTURE2D);

    rtvDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
    ID3D11RenderTargetView* pRTV;
    V(pDevice->CreateRenderTargetView(pD3D11Texture.get(), &rtvDesc, &pRTV));
    *ppRTV = pRTV;
    STAR_SET_DEBUG_NAME(pRTV, length, debugName);

    rtvDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM_SRGB;
    V(pDevice->CreateRenderTargetView(pD3D11Texture.get(), &rtvDesc, &pRTV));
    *ppRTVsRGB = pRTV;
    STAR_SET_DEBUG_STRING(pRTV, (debugName + std::string("_sRGB")));
    
    // dsv
    if(ppDSV) {
        D3D11_TEXTURE2D_DESC descTex2D = {
            desc.BufferDesc.Width,
            desc.BufferDesc.Height,
            1, 1, DXGI_FORMAT_D32_FLOAT,{ 1, 0 },
            D3D11_USAGE_DEFAULT, D3D11_BIND_DEPTH_STENCIL,
            0, 0
        };
        
        
        std::unique_ptr<ID3D11Texture2D, COMDeleter> pDST;
        V(pDevice->CreateTexture2D(&descTex2D, nullptr, ref(pDST)));
        STAR_SET_DEBUG_NAME(pDST, length, debugName);

        D3D11_DEPTH_STENCIL_VIEW_DESC descV = {
            DXGI_FORMAT_D32_FLOAT, D3D11_DSV_DIMENSION_TEXTURE2D, 0,{ 0 }
        };
        ID3D11DepthStencilView* pDSV;
        V(pDevice->CreateDepthStencilView(pDST.get(), &descV, &pDSV));
        *ppDSV = pDSV;
        STAR_SET_DEBUG_NAME(pDSV, length, debugName);
    }
}
Example #3
0
void Texture2D::InternalConstruct(ID3D11Device* d3dDevice,
                                  int width, int height, DXGI_FORMAT format,
                                  UINT bindFlags, int mipLevels, int arraySize,
                                  int sampleCount, int sampleQuality,
                                  D3D11_RTV_DIMENSION rtvDimension,
                                  D3D11_UAV_DIMENSION uavDimension,
                                  D3D11_SRV_DIMENSION srvDimension)
{
    // Initalize
    mShaderResource = 0;

    CD3D11_TEXTURE2D_DESC desc(
        format,
        width, height, arraySize, mipLevels,
        bindFlags,
        D3D11_USAGE_DEFAULT, 0,
        sampleCount, sampleQuality,
        // If they request mipmap levels, it's nice to be able to autogenerate them.
        (mipLevels != 1 ? D3D11_RESOURCE_MISC_GENERATE_MIPS : 0));

    d3dDevice->CreateTexture2D(&desc, 0, &mTexture);

    // Update with actual mip levels, etc.
    mTexture->GetDesc(&desc);

    if (bindFlags & D3D11_BIND_RENDER_TARGET) {
        for (int i = 0; i < arraySize; ++i) {
            CD3D11_RENDER_TARGET_VIEW_DESC rtvDesc(
                rtvDimension,
                format,
                0,          // Mips
                i, 1        // Array
            );

            ID3D11RenderTargetView* renderTargetView;
            d3dDevice->CreateRenderTargetView(mTexture, &rtvDesc, &renderTargetView);
            mRenderTargetElements.push_back(renderTargetView);
        }
    }

    if (bindFlags & D3D11_BIND_UNORDERED_ACCESS) {
        // UAV's can't point to multisampled resources!
        assert(uavDimension != D3D11_UAV_DIMENSION_UNKNOWN);

        for (int i = 0; i < arraySize; ++i) {
            CD3D11_UNORDERED_ACCESS_VIEW_DESC uavDesc(
                uavDimension,
                format,
                0,          // Mips
                i, 1        // Array
            );

            ID3D11UnorderedAccessView* unorderedAccessView;
            d3dDevice->CreateUnorderedAccessView(mTexture, &uavDesc, &unorderedAccessView);
            mUnorderedAccessElements.push_back(unorderedAccessView);
        }
    }

    if (bindFlags & D3D11_BIND_SHADER_RESOURCE) {
        // Whole resource
        CD3D11_SHADER_RESOURCE_VIEW_DESC srvDesc(
            srvDimension,
            format,
            0, desc.MipLevels,  // Mips
            0, desc.ArraySize   // Array
        );        

        d3dDevice->CreateShaderResourceView(mTexture, &srvDesc, &mShaderResource);

        // Single elements
        for (int i = 0; i < arraySize; ++i) {
            CD3D11_SHADER_RESOURCE_VIEW_DESC srvElementDesc(
                srvDimension,
                format,
                0, 1,  // Mips
                i, 1   // Array
            );

            ID3D11ShaderResourceView* shaderResourceView;
            d3dDevice->CreateShaderResourceView(mTexture, &srvElementDesc, &shaderResourceView);
            mShaderResourceElements.push_back(shaderResourceView);
        }
    }
}