コード例 #1
0
bool DirectX11Texture2DHelper::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)
{
	CD3D11_TEXTURE2D_DESC textureDesc(format, width, height, arraySize, mipLevels, bindFlags, D3D11_USAGE_DEFAULT, 0, sampleCount, sampleQuality, mipLevels != 1 ? D3D11_RESOURCE_MISC_GENERATE_MIPS : 0);

	if(FAILED(d3dDevice->CreateTexture2D(&textureDesc, 0, mTexture.getModifiablePointer())))
		return true;

	mTexture->GetDesc(&textureDesc);

	if(bindFlags & D3D11_BIND_RENDER_TARGET)
	{
		mRenderTargetElements.resize(arraySize);
		for(int i = 0; i < arraySize; ++i)
		{
			CD3D11_RENDER_TARGET_VIEW_DESC textureRTVDesc(rtvDimension, format, 0, i, 1);
			if(FAILED(d3dDevice->CreateRenderTargetView(mTexture, &textureRTVDesc, mRenderTargetElements[i].getModifiablePointer())))
				return true;
		}
	}

	if(bindFlags & D3D11_BIND_UNORDERED_ACCESS)
	{
		mUnorderedAccessElements.resize(arraySize);
		for(int i = 0; i < arraySize; ++i)
		{
			CD3D11_UNORDERED_ACCESS_VIEW_DESC textureUAVDesc(uavDimension, format, 0, i, 1);
			if(FAILED(d3dDevice->CreateUnorderedAccessView(mTexture, &textureUAVDesc, mUnorderedAccessElements[i].getModifiablePointer())))
				return true;
		}
	}

	if(bindFlags & D3D11_BIND_SHADER_RESOURCE)
	{
		CD3D11_SHADER_RESOURCE_VIEW_DESC srvDesc(srvDimension, format, 0, textureDesc.MipLevels, 0, textureDesc.ArraySize);        
		d3dDevice->CreateShaderResourceView(mTexture, &srvDesc, mShaderResource.getModifiablePointer());

		mShaderResourceElements.resize(arraySize);
		for(int i = 0; i < arraySize; ++i)
		{
			CD3D11_SHADER_RESOURCE_VIEW_DESC srvElementDesc(srvDimension, format, 0, 1, i, 1);
			if(FAILED(d3dDevice->CreateShaderResourceView(mTexture, &srvElementDesc, mShaderResourceElements[i].getModifiablePointer())))
				return true;
		}
	}

	return false;
}
コード例 #2
0
ファイル: Texture2D.cpp プロジェクト: paveljanovsky/Awe
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);
        }
    }
}