void RenderDeviceD3D11Impl :: CreateTexture(const TextureDesc& TexDesc, const TextureData &Data, ITexture **ppTexture) { CreateDeviceObject( "texture", TexDesc, ppTexture, [&]() { TextureBaseD3D11 *pTextureD3D11 = nullptr; switch( TexDesc.Type ) { case RESOURCE_DIM_TEX_1D: case RESOURCE_DIM_TEX_1D_ARRAY: pTextureD3D11 = NEW_RC_OBJ(m_TexObjAllocator, "Texture1D_D3D11 instance", Texture1D_D3D11) (m_TexViewObjAllocator, this, TexDesc, Data ); break; case RESOURCE_DIM_TEX_2D: case RESOURCE_DIM_TEX_2D_ARRAY: case RESOURCE_DIM_TEX_CUBE: case RESOURCE_DIM_TEX_CUBE_ARRAY: pTextureD3D11 = NEW_RC_OBJ(m_TexObjAllocator, "Texture2D_D3D11 instance", Texture2D_D3D11) (m_TexViewObjAllocator, this, TexDesc, Data ); break; case RESOURCE_DIM_TEX_3D: pTextureD3D11 = NEW_RC_OBJ(m_TexObjAllocator, "Texture3D_D3D11 instance", Texture3D_D3D11) (m_TexViewObjAllocator, this, TexDesc, Data ); break; default: LOG_ERROR_AND_THROW( "Unknown texture type. (Did you forget to initialize the Type member of TextureDesc structure?)" ); } pTextureD3D11->QueryInterface( IID_Texture, reinterpret_cast<IObject**>(ppTexture) ); pTextureD3D11->CreateDefaultViews(); OnCreateDeviceObject( pTextureD3D11 ); } ); }
void CreateImageFromFile( const Diligent::Char *FilePath, Image **ppImage, IDataBlob **ppDDSData) { auto *pDotPos = strrchr( FilePath, '.' ); if( pDotPos == nullptr ) LOG_ERROR_AND_THROW( "File path ", FilePath, " does not contain extension" ); auto *pExtension = pDotPos + 1; if( *pExtension == 0 ) LOG_ERROR_AND_THROW( "File path ", FilePath, " contains empty extension" ); String Extension(pExtension); std::transform( Extension.begin(), Extension.end(), Extension.begin(), ::tolower ); Diligent::RefCntAutoPtr<BasicFileStream> pFileStream( new BasicFileStream( FilePath, EFileAccessMode::Read ) ); if( Extension == "dds" ) { VERIFY_EXPR(ppDDSData != nullptr); *ppDDSData = new DataBlobImpl; pFileStream->Read(*ppDDSData); (*ppDDSData)->AddRef(); } else { ImageLoadInfo ImgLoadInfo; if( Extension == "png" ) ImgLoadInfo.Format = EImageFileFormat::png; else if( Extension == "jpeg" || Extension == "jpg" ) ImgLoadInfo.Format = EImageFileFormat::jpeg; else if( Extension == "tiff" || Extension == "tif" ) ImgLoadInfo.Format = EImageFileFormat::tiff; else LOG_ERROR_AND_THROW( "Unsupported file format ", Extension ); *ppImage = new Image(pFileStream, ImgLoadInfo); (*ppImage)->AddRef(); } }
void Texture1D_D3D11::CreateUAV( TextureViewDesc &UAVDesc, ID3D11UnorderedAccessView **ppD3D11UAV ) { VERIFY( ppD3D11UAV && *ppD3D11UAV == nullptr, "UAV pointer address is null or contains non-null pointer to an existing object" ); VERIFY( UAVDesc.ViewType == TEXTURE_VIEW_UNORDERED_ACCESS, "Incorrect view type: unordered access is expected" ); if( !(UAVDesc.TextureDim == RESOURCE_DIM_TEX_1D || UAVDesc.TextureDim == RESOURCE_DIM_TEX_1D_ARRAY) ) LOG_ERROR_AND_THROW("Unsupported texture type. Only RESOURCE_DIM_TEX_1D or RESOURCE_DIM_TEX_1D_ARRAY is allowed"); if( UAVDesc.Format == TEX_FORMAT_UNKNOWN ) { UAVDesc.Format = m_Desc.Format; } D3D11_UNORDERED_ACCESS_VIEW_DESC D3D11_UAVDesc; TextureViewDesc_to_D3D11_UAV_DESC(UAVDesc, D3D11_UAVDesc); auto *pDeviceD3D11 = static_cast<RenderDeviceD3D11Impl*>(GetDevice())->GetD3D11Device(); CHECK_D3D_RESULT_THROW( pDeviceD3D11->CreateUnorderedAccessView( m_pd3d11Texture, &D3D11_UAVDesc, ppD3D11UAV ), "Failed to create D3D11 unordered access view"); }
void Texture1D_D3D11::CreateDSV( TextureViewDesc &DSVDesc, ID3D11DepthStencilView **ppD3D11DSV ) { VERIFY( ppD3D11DSV && *ppD3D11DSV == nullptr, "DSV pointer address is null or contains non-null pointer to an existing object" ); VERIFY( DSVDesc.ViewType == TEXTURE_VIEW_DEPTH_STENCIL, "Incorrect view type: depth stencil is expected" ); if( !(DSVDesc.TextureDim == RESOURCE_DIM_TEX_1D || DSVDesc.TextureDim == RESOURCE_DIM_TEX_1D_ARRAY) ) LOG_ERROR_AND_THROW("Unsupported texture type. Only RESOURCE_DIM_TEX_1D or RESOURCE_DIM_TEX_1D_ARRAY is allowed"); if( DSVDesc.Format == TEX_FORMAT_UNKNOWN ) { DSVDesc.Format = m_Desc.Format; } D3D11_DEPTH_STENCIL_VIEW_DESC D3D11_DSVDesc; TextureViewDesc_to_D3D11_DSV_DESC(DSVDesc, D3D11_DSVDesc, m_Desc.SampleCount); auto *pDeviceD3D11 = static_cast<RenderDeviceD3D11Impl*>(GetDevice())->GetD3D11Device(); CHECK_D3D_RESULT_THROW( pDeviceD3D11->CreateDepthStencilView( m_pd3d11Texture, &D3D11_DSVDesc, ppD3D11DSV ), "Failed to create D3D11 depth stencil view"); }
void Texture1D_D3D11::CreateRTV( TextureViewDesc &RTVDesc, ID3D11RenderTargetView **ppD3D11RTV ) { VERIFY( ppD3D11RTV && *ppD3D11RTV == nullptr, "RTV pointer address is null or contains non-null pointer to an existing object" ); VERIFY( RTVDesc.ViewType == TEXTURE_VIEW_RENDER_TARGET, "Incorrect view type: render target is expected" ); if( !(RTVDesc.TextureDim == RESOURCE_DIM_TEX_1D || RTVDesc.TextureDim == RESOURCE_DIM_TEX_1D_ARRAY ) ) LOG_ERROR_AND_THROW( "Unsupported texture type. Only RESOURCE_DIM_TEX_1D or RESOURCE_DIM_TEX_1D_ARRAY is allowed" ); if( RTVDesc.Format == TEX_FORMAT_UNKNOWN ) { RTVDesc.Format = m_Desc.Format; } D3D11_RENDER_TARGET_VIEW_DESC D3D11_RTVDesc; TextureViewDesc_to_D3D11_RTV_DESC(RTVDesc, D3D11_RTVDesc, m_Desc.SampleCount); auto *pDeviceD3D11 = static_cast<RenderDeviceD3D11Impl*>(GetDevice())->GetD3D11Device(); CHECK_D3D_RESULT_THROW( pDeviceD3D11->CreateRenderTargetView( m_pd3d11Texture, &D3D11_RTVDesc, ppD3D11RTV ), "Failed to create D3D11 render target view"); }
void Texture1D_D3D11::CreateSRV( TextureViewDesc &SRVDesc, ID3D11ShaderResourceView **ppD3D11SRV ) { VERIFY( ppD3D11SRV && *ppD3D11SRV == nullptr, "SRV pointer address is null or contains non-null pointer to an existing object" ); VERIFY( SRVDesc.ViewType == TEXTURE_VIEW_SHADER_RESOURCE, "Incorrect view type: shader resource is expected" ); if( !(SRVDesc.TextureDim == RESOURCE_DIM_TEX_1D || SRVDesc.TextureDim == RESOURCE_DIM_TEX_1D_ARRAY) ) LOG_ERROR_AND_THROW( "Unsupported texture type. Only RESOURCE_DIM_TEX_1D or RESOURCE_DIM_TEX_1D_ARRAY is allowed" ); if( SRVDesc.Format == TEX_FORMAT_UNKNOWN ) { SRVDesc.Format = m_Desc.Format; } D3D11_SHADER_RESOURCE_VIEW_DESC D3D11_SRVDesc; TextureViewDesc_to_D3D11_SRV_DESC(SRVDesc, D3D11_SRVDesc, m_Desc.SampleCount); auto *pDeviceD3D11 = static_cast<RenderDeviceD3D11Impl*>(GetDevice())->GetD3D11Device(); CHECK_D3D_RESULT_THROW( pDeviceD3D11->CreateShaderResourceView( m_pd3d11Texture, &D3D11_SRVDesc, ppD3D11SRV ), "Failed to create D3D11 shader resource view"); }
BufferGLImpl::BufferGLImpl(IReferenceCounters *pRefCounters, FixedBlockMemoryAllocator &BuffViewObjMemAllocator, RenderDeviceGLImpl *pDeviceGL, const BufferDesc& BuffDesc, const BufferData &BuffData /*= BufferData()*/, bool bIsDeviceInternal) : TBufferBase( pRefCounters, BuffViewObjMemAllocator, pDeviceGL, BuffDesc, bIsDeviceInternal), m_GlBuffer(true), // Create buffer immediately m_uiMapTarget(0), m_GLUsageHint(UsageToGLUsage(BuffDesc.Usage)), m_bUseMapWriteDiscardBugWA(GetUseMapWriteDiscardBugWA(pDeviceGL)) { if( BuffDesc.Usage == USAGE_STATIC && BuffData.pData == nullptr ) LOG_ERROR_AND_THROW("Static buffer must be initialized with data at creation time"); auto Target = GetBufferBindTarget(BuffDesc); // TODO: find out if it affects performance if the buffer is originally bound to one target // and then bound to another (such as first to GL_ARRAY_BUFFER and then to GL_UNIFORM_BUFFER) glBindBuffer(Target, m_GlBuffer); VERIFY(BuffData.pData == nullptr || BuffData.DataSize >= BuffDesc.uiSizeInBytes, "Data pointer is null or data size is not consistent with buffer size" ); GLsizeiptr DataSize = BuffDesc.uiSizeInBytes; const GLvoid *pData = nullptr; if( BuffData.pData && BuffData.DataSize >= BuffDesc.uiSizeInBytes ) { pData = BuffData.pData; DataSize = BuffData.DataSize; } // Create and initialize a buffer object's data store // Target must be one of GL_ARRAY_BUFFER, GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, // GL_ELEMENT_ARRAY_BUFFER, GL_PIXEL_PACK_BUFFER, GL_PIXEL_UNPACK_BUFFER, GL_TEXTURE_BUFFER, // GL_TRANSFORM_FEEDBACK_BUFFER, or GL_UNIFORM_BUFFER. // Usage must be one of GL_STREAM_DRAW, GL_STREAM_READ, GL_STREAM_COPY, GL_STATIC_DRAW, // GL_STATIC_READ, GL_STATIC_COPY, GL_DYNAMIC_DRAW, GL_DYNAMIC_READ, or GL_DYNAMIC_COPY. //The frequency of access may be one of these: // //STREAM // The data store contents will be modified once and used at most a few times. // //STATIC // The data store contents will be modified once and used many times. // //DYNAMIC // The data store contents will be modified repeatedly and used many times. // //The nature of access may be one of these: // //DRAW // The data store contents are modified by the application, and used as the source for GL // drawing and image specification commands. // //READ // The data store contents are modified by reading data from the GL, and used to return that // data when queried by the application. // //COPY // The data store contents are modified by reading data from the GL, and used as the source // for GL drawing and image specification commands. // See also http://www.informit.com/articles/article.aspx?p=2033340&seqNum=2 // All buffer bind targets (GL_ARRAY_BUFFER, GL_ELEMENT_ARRAY_BUFFER etc.) relate to the same // kind of objects. As a result they are all equivalent from a transfer point of view. glBufferData(Target, DataSize, pData, m_GLUsageHint); CHECK_GL_ERROR_AND_THROW("glBufferData() failed"); glBindBuffer(Target, 0); }
void Texture3D_D3D11::CreateDSV( TextureViewDesc &pDSVDesc, ID3D11DepthStencilView **ppD3D11DSV ) { LOG_ERROR_AND_THROW("Depth stencil views are not supported for 3D textures"); }