예제 #1
0
	Ptr<TextureDepthStencilView> D3D11Texture2D::CreateDepthStencilView(int32_t mipLevel, int32_t firstArray, int32_t numArrays, RenderFormat viewFormat)
	{
		// Init d3d11 dsv desc
		D3D11_DEPTH_STENCIL_VIEW_DESC desc;
		memset(&desc, 0, sizeof(desc));

		if (firstArray == 0 && numArrays == 1)
		{
			desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D;
			desc.Texture2D.MipSlice = mipLevel;
		}
		else
		{
			desc.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2DARRAY;
			desc.Texture2DArray.FirstArraySlice = firstArray;
			desc.Texture2DArray.ArraySize = numArrays;
			desc.Texture2DArray.MipSlice = mipLevel;
		}
		if (viewFormat == RENDER_FORMAT_UNDEFINED)
			desc.Format = GetD3DFormat(_desc.format);
		else
			desc.Format = GetD3DFormat(viewFormat);
		desc.Flags = 0;

		auto re = std::static_pointer_cast<D3D11RenderEngine>(Global::GetRenderEngine());

		// Create d3d11 rtv
		ID3D11DepthStencilView *pDSV = nullptr;
		D3D11RenderEngine::d3d11Device->CreateDepthStencilView(_hardwareTexture2D.get(), &desc, &pDSV);

		auto resultDSV = std::make_shared<D3D11TextureDepthStencilView>();
		resultDSV->hardwareDSV = MakeComShared(pDSV);

		return resultDSV;
	}
예제 #2
0
	Ptr<TextureUnorderedAccessView> D3D11Texture2D::CreateUnorderedAccessView(int32_t mipLevel, int32_t firstArray, int32_t numArrays, RenderFormat viewFormat)
	{
		// Init d3d11 uav desc
		D3D11_UNORDERED_ACCESS_VIEW_DESC desc;
		memset(&desc, 0, sizeof(desc));

		if (firstArray == 0 && numArrays == 1)
		{
			desc.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2D;
			desc.Texture2D.MipSlice = mipLevel;
		}
		else
		{
			desc.ViewDimension = D3D11_UAV_DIMENSION_TEXTURE2DARRAY;
			desc.Texture2DArray.FirstArraySlice = firstArray;
			desc.Texture2DArray.ArraySize = numArrays;
			desc.Texture2DArray.MipSlice = mipLevel;
		}
		if (viewFormat == RENDER_FORMAT_UNDEFINED)
			desc.Format = GetD3DFormat(_desc.format);
		else
			desc.Format = GetD3DFormat(viewFormat);

		auto re = std::static_pointer_cast<D3D11RenderEngine>(Global::GetRenderEngine());

		// Create d3d11 uav
		ID3D11UnorderedAccessView *pUAV = nullptr;
		D3D11RenderEngine::d3d11Device->CreateUnorderedAccessView(_hardwareTexture2D.get(), &desc, &pUAV);

		auto resultUAV = std::make_shared<D3D11TextureUnorderedAccessView>();
		resultUAV->hardwareUAV = MakeComShared(pUAV);

		return resultUAV;
	}
예제 #3
0
	Ptr<TextureShaderResourceView> D3D11Texture2D::CreateShaderResourceView(int32_t firstMip, int32_t numMips, int32_t firstArray, int32_t numArrays, bool bCube, RenderFormat viewFormat)
	{
		// Init d3d11 srv desc
		D3D11_SHADER_RESOURCE_VIEW_DESC desc;
		memset(&desc, 0, sizeof(desc));
		if (!bCube)
		{
			if (firstArray == 0 && numArrays == 1)
			{
				desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
				desc.Texture2D.MostDetailedMip = firstMip;
				desc.Texture2D.MipLevels = numMips;
			}
			else
			{
				desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY;
				desc.Texture2DArray.MostDetailedMip = firstMip;
				desc.Texture2DArray.MipLevels = numMips;
				desc.Texture2DArray.FirstArraySlice = firstArray;
				desc.Texture2DArray.ArraySize = numArrays;
			}
		}
		else
		{
			if (numArrays == 1)
			{
				desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE;
				desc.TextureCube.MostDetailedMip = firstMip;
				desc.TextureCube.MipLevels = numMips;
			}
			else
			{
				desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBEARRAY;
				desc.TextureCubeArray.MostDetailedMip = firstMip;
				desc.TextureCubeArray.MipLevels = numMips;
				desc.TextureCubeArray.First2DArrayFace = firstArray;
				desc.TextureCubeArray.NumCubes = numArrays;
			}
		}
		if (viewFormat == RENDER_FORMAT_UNDEFINED)
			desc.Format = GetD3DFormat(_desc.format);
		else
			desc.Format = GetD3DFormat(viewFormat);

		auto re = std::static_pointer_cast<D3D11RenderEngine>(Global::GetRenderEngine());

		// Create d3d11 srv
		ID3D11ShaderResourceView *pSRV = nullptr;
		D3D11RenderEngine::d3d11Device->CreateShaderResourceView(_hardwareTexture2D.get(), &desc, &pSRV);

		auto resultSRV = std::make_shared<D3D11TextureShaderResourceView>();
		resultSRV->hardwareSRV = MakeComShared(pSRV);

		return resultSRV;
	}
예제 #4
0
	void D3D11Texture2D::Init(const std::vector<RenderDataDesc> & initDataList)
	{
		D3D11Texture::Init(initDataList);

		bool bWithData = initDataList.size() > 0;

		auto adjustArraySize = _desc.bCube ? _desc.arraySize * 6 : _desc.arraySize;

		// Init desc
		D3D11_TEXTURE2D_DESC d3dTexDesc;
		d3dTexDesc.Format = GetD3DFormat(_desc.format);
		d3dTexDesc.Width = _desc.width;
		d3dTexDesc.Height = _desc.height;
		d3dTexDesc.ArraySize = adjustArraySize;
		d3dTexDesc.MipLevels = _desc.mipLevels;
		d3dTexDesc.SampleDesc.Count = _desc.sampleCount;
		d3dTexDesc.SampleDesc.Quality = _desc.sampleQuality;
		GetD3DTextureCreateFlags(bWithData, d3dTexDesc.BindFlags, d3dTexDesc.CPUAccessFlags, d3dTexDesc.MiscFlags, d3dTexDesc.Usage);

		if (IsCompress(_desc.format))
		{
			if (d3dTexDesc.Width > 1)
				d3dTexDesc.Width = (d3dTexDesc.Width + 3) / 4 * 4;
			if (d3dTexDesc.Height > 1)
				d3dTexDesc.Height = (d3dTexDesc.Height + 3) / 4 * 4;
		}

		auto re = std::static_pointer_cast<D3D11RenderEngine>(Global::GetRenderEngine());
		ID3D11Texture2D *pTexture2D = nullptr;

		// Init with data
		if (initDataList.size() > 0)
		{
			D3D11_SUBRESOURCE_DATA *pInitDataDesc = nullptr;
			std::vector<D3D11_SUBRESOURCE_DATA> initDataDescList(adjustArraySize * _desc.mipLevels);
			int32_t dataIndex = 0;
			for (int32_t arrayIndex = 0; arrayIndex != adjustArraySize; ++arrayIndex)
			{
				for (int32_t mipIndex = 0; mipIndex != _desc.mipLevels; ++mipIndex)
				{
					auto &initData = initDataList[dataIndex];
					initDataDescList[dataIndex].pSysMem = initData.pData;
					initDataDescList[dataIndex].SysMemPitch = static_cast<uint32_t>(initData.rowPitch);
					initDataDescList[dataIndex].SysMemSlicePitch = static_cast<uint32_t>(initData.slicePitch);

					++dataIndex;
				}
			}
			pInitDataDesc = &initDataDescList[0];
			D3D11RenderEngine::d3d11Device->CreateTexture2D(&d3dTexDesc, pInitDataDesc, &pTexture2D);
		}
		else
			D3D11RenderEngine::d3d11Device->CreateTexture2D(&d3dTexDesc, nullptr, &pTexture2D);

		_hardwareTexture2D = MakeComShared(pTexture2D);
	}
예제 #5
0
HRESULT __stdcall CopyAviSynthToBuffer(const byte* src, int srcPitch, int clipPrecision, int width, int height, InputTexture* dst, IScriptEnvironment* env) {
	// Copies source frame into main surface buffer, or into additional input textures
	RECT SrcRect;
	SrcRect.top = 0;
	SrcRect.left = 0;
	SrcRect.right = width;
	SrcRect.bottom = height;
	HR(D3DXLoadSurfaceFromMemory(dst->Surface, nullptr, nullptr, src, GetD3DFormat(clipPrecision, false), srcPitch, nullptr, &SrcRect, D3DX_FILTER_NONE, 0));
	return S_OK;
}
예제 #6
0
void D3D9RenderTarget::BuildRenderTarget()
{
	XTRACE_FUNCTION;

	ASSERT( m_Params.Width );
	ASSERT( m_Params.Height );

	STATIC_HASHED_STRING( Render );
	CATPRINTF( sRender, 1, "Building render target...\n" );

	uint ColorUsage = D3DUSAGE_RENDERTARGET;
	if( m_Params.AutoGenMipMaps )
	{
		ColorUsage |= D3DUSAGE_AUTOGENMIPMAP;
	}

	uint DepthStencilUsage = D3DUSAGE_DEPTHSTENCIL;

	if( m_Params.ColorFormat != ERTF_None )
	{
		CATPRINTF( sRender, 1, "Trying to create color texture with format %d\n", m_Params.ColorFormat );

		const ERenderTargetFormat SupportedFormat = m_Renderer->GetBestSupportedRenderTargetFormat( m_Params.ColorFormat );
		CATPRINTF( sRender, 1, "Creating color texture with format %d...\n", SupportedFormat );

		IDirect3DTexture9* ColorTexture;
		HRESULT hr = m_D3DDevice->CreateTexture(
			m_Params.Width,
			m_Params.Height,
			1,
			ColorUsage,
			GetD3DFormat( SupportedFormat ),
			D3DPOOL_DEFAULT,
			&ColorTexture,
			NULL );
		ASSERT( hr == D3D_OK );
		m_ColorTexture = new D3D9Texture( m_D3DDevice, ColorTexture );
		ColorTexture->GetSurfaceLevel( 0, &m_ColorSurface );
	}

	if( m_Params.DepthStencilFormat != ERTF_None )
	{
		if( m_Params.DepthStencilFormat != ERTF_UseDefault )
		{
			CATPRINTF( sRender, 1, "Trying to create depth/stencil texture with format %d\n", m_Params.DepthStencilFormat );

			const ERenderTargetFormat SupportedFormat = m_Renderer->GetBestSupportedRenderTargetFormat( m_Params.DepthStencilFormat );
			CATPRINTF( sRender, 1, "Creating depth/stencil texture with format %d...\n", SupportedFormat );

			IDirect3DTexture9* DepthStencilTexture;
			HRESULT hr = m_D3DDevice->CreateTexture(
				m_Params.Width,
				m_Params.Height,
				1,
				DepthStencilUsage,
				GetD3DFormat( SupportedFormat ),
				D3DPOOL_DEFAULT,
				&DepthStencilTexture, NULL );
			ASSERT( hr == D3D_OK );
			m_DepthStencilTexture = new D3D9Texture( m_D3DDevice, DepthStencilTexture );
			DepthStencilTexture->GetSurfaceLevel( 0, &m_DepthStencilSurface );
		}
		else
		{
			m_DepthStencilSurface = ( IDirect3DSurface9* )( m_Renderer->GetDefaultRenderTarget()->GetDepthStencilRenderTargetHandle() );
			m_DepthStencilSurface->AddRef();
		}
	}

	CATPRINTF( sRender, 1, "Render target built.\n" );
}