dx11资源

Direct3D 11 API 返回值.

D3D11_ERROR_FILE_NOT_FOUND

文件未找到

D3D11_ERROR_TOO_MANY_UNIQUE_STATE_OBJECTS

特定类型状态对象的太多唯一实例

D3D11_ERROR_TOO_MANY_UNIQUE_VIEW_OBJECTS

特定类型视图对象的太多唯一实例

D3D11_ERROR_DEFERRED_CONTEXT_MAP_WITHOUT_INITIAL_DISCARD

ID3D11Device::CreateDeferredContext 或 ID3D11DeviceContext::FinishCommandList后第一次调用ID3D11DeviceContext::Map时资源类型不是D3D11_MAP_WRITE_DISCARD.

D3DERR_INVALIDCALL

无效调用.例如参数为无效指针。

D3DERR_WASSTILLDRAWING

当前表面数据正在被使用

E_FAIL

试图创建一个启用调试层的设备但是调试层未安装

E_INVALIDARG

参数无效

E_OUTOFMEMORY

内存不足

S_FALSE

备用成功值.非标准调用时成功.例如检测参数有效性.

S_OK

成功

DXGI_SAMPLE_DESC

资源的多重采样参数

typedefstructDXGI_SAMPLE_DESC {

       UINTCount//每个像素多重采样次数

       UINTQuality//质量等级,0~CheckMultisampleQualityLevels()-1

} DXGI_SAMPLE_DESC, *LPDXGI_SAMPLE_DESC;

默认采样模式无抗锯齿功能, Count =1 , Quality = 0.

如果使用多重采样抗锯齿,所有绑定的渲染目标和深度缓存必须有相同的采样数和质量等级.

D3D11_BIND_FLAG

D3D11_BUFFER_DESC, D3D11_TEXTURE1D_DESC, D3D11_TEXTURE2D_DESC, D3D11_TEXTURE3D_DESC的BindFlags参数,标绑定类型.

typedefenumD3D11_BIND_FLAG {

       D3D11_BIND_VERTEX_BUFFER = 0x1L,  //顶点缓存

       D3D11_BIND_INDEX_BUFFER = 0x2L,  //索引缓存

       D3D11_BIND_CONSTANT_BUFFER = 0x4L,  //const buffer

       D3D11_BIND_SHADER_RESOURCE = 0x8L,  //shader resource

       D3D11_BIND_STREAM_OUTPUT = 0x10L,

       D3D11_BIND_RENDER_TARGET = 0x20L,  //渲染目标

       D3D11_BIND_DEPTH_STENCIL = 0x40L,  //深度缓存

       D3D11_BIND_UNORDERED_ACCESS = 0x80L  //无序访问资源

} D3D11_BIND_FLAG;

可以用逻辑或组合 (除了constant-buffer);然而,你应该使用单个标志允许设备对资源的优化。

shader-resource buffer不是 constant buffer;而是绑定到shader 的texture 或者 buffer.shader-resource buffer不能使用D3D11_MAP_WRITE_NO_OVERWRITE.

D3D11_CPU_ACCESS_FLAG

D3D11_BUFFER_DESC,

D3D11_TEXTURE1D_DESC,

D3D11_TEXTURE2D_DESC,

D3D11_TEXTURE3D_DESCCPUAccessFlags参数.

typedefenumD3D11_CPU_ACCESS_FLAG {

       D3D11_CPU_ACCESS_WRITE = 0x10000L,//使用此标识符的资源不能

//用作渲染管线的输出,而且必须使用dynamic或staging标识符创建

       D3D11_CPU_ACCESS_READ = 0x20000L//使用此标识符的资源不能用

//作渲染管线的输入和输出,而且必须使用staging标识创建

} D3D11_CPU_ACCESS_FLAG;

可以用逻辑或组合,也可以用0,资源将自动优化.

D3D11_RESOURCE_MISC_FLAG

D3D11_BUFFER_DESC,

D3D11_TEXTURE1D_DESC,

D3D11_TEXTURE2D_DESC,

D3D11_TEXTURE3D_DESCMiscFlags参数, 不常用的标识符.

 

typedefenumD3D11_RESOURCE_MISC_FLAG {

       D3D11_RESOURCE_MISC_GENERATE_MIPS = 0x1L,

       D3D11_RESOURCE_MISC_SHARED = 0x2L,

       D3D11_RESOURCE_MISC_TEXTURECUBE = 0x4L,

       D3D11_RESOURCE_MISC_DRAWINDIRECT_ARGS = 0x10L,

       D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS = 0x20L,

       D3D11_RESOURCE_MISC_BUFFER_STRUCTURED = 0x40L,

       D3D11_RESOURCE_MISC_RESOURCE_CLAMP = 0x80L,

       D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX = 0x100L,

       D3D11_RESOURCE_MISC_GDI_COMPATIBLE = 0x200L

} D3D11_RESOURCE_MISC_FLAG;

D3D11_RESOURCE_MISC_GENERATE_MIPS

Enables mipmap generationusing ID3D11DeviceContext::GenerateMips on atexture resource. The resource must be created with the bind flags thatspecify that the resource is a render target and a shader resource.

D3D11_RESOURCE_MISC_SHARED

Enables resource data sharingbetween two or more Direct3D devices. The only resources that can be shared are2D non-mipmapped textures.

D3D11_RESOURCE_MISC_SHARED and D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEXare mutually exclusive.

WARP and REF devices do notsupport shared resources. Attempting to create a resource with this flag oneither a WARP or REF device will cause the create method to return anE_OUTOFMEMORY error code.

D3D11_RESOURCE_MISC_TEXTURECUBE

Enables a resource to be acube texture created from a Texture2DArray that contains 6 textures.

D3D11_RESOURCE_MISC_DRAWINDIRECT_ARGS

Enables instancing ofGPU-generated content.

D3D11_RESOURCE_MISC_BUFFER_ALLOW_RAW_VIEWS

Enables a resource as a byteaddress buffer.

D3D11_RESOURCE_MISC_BUFFER_STRUCTURED

Enables a resource as a structuredbuffer.

D3D11_RESOURCE_MISC_RESOURCE_CLAMP

Enables a resource with mipmapclamping for use with ID3D11DeviceContext::SetResourceMinLOD.

D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX

Enables the resource createdto be synchronized using the IDXGIKeyedMutex::AcquireSync and IDXGIKeyedMutex::ReleaseSync APIs.The following Direct3D 11 resource creation APIs, that takeD3D11_RESOURCE_MISC_FLAG parameters, have been extended to support the newflag.

·       ID3D11Device::CreateTexture1D

·       ID3D11Device::CreateTexture2D

·       ID3D11Device::CreateTexture3D

·       ID3D11Device::CreateBuffer

If any of the above methods iscalled with the D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX flag set, the interfacereturned will support the IDXGIKeyedMutexinterface. The IDXGIKeyedMutexinterface can be acquired from the resource using IUnknown::QueryInterface. The IDXGIKeyedMutex interface implements the IDXGIKeyedMutex::AcquireSync and IDXGIKeyedMutex::ReleaseSync APIsto synchronize access to the surface. The device creating the surface, and anyother device opening the surface (using OpenSharedResource) isrequired to call IDXGIKeyedMutex::AcquireSyncbefore any rendering commands to the surface, and IDXGIKeyedMutex::ReleaseSync when it is done rendering.

D3D11_RESOURCE_MISC_SHARED and D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEXare mutually exclusive.

WARP and REF devices do notsupport shared resources. Attempting to create a resource with this flag oneither a WARP or REF device will cause the create method to return anE_OUTOFMEMORY error code.

D3D11_RESOURCE_MISC_GDI_COMPATIBLE

Enables a resource compatiblewith GDI. The D3D11_RESOURCE_MISC_GDI_COMPATIBLEflag is required on surfaces that will be used with GDI. Setting the D3D11_RESOURCE_MISC_GDI_COMPATIBLEflag allows GDI rendering on the surface via GetDC.

Remarks

This enumeration is used in D3D11_BUFFER_DESC, D3D11_TEXTURE1D_DESC, D3D11_TEXTURE2D_DESC, D3D11_TEXTURE3D_DESC.

These flags can be combined bybitwise OR.

 

D3D11_TEXTURE2D_DESC

2D纹理描述

typedefstructD3D11_TEXTURE2D_DESC

{

       UINT             Width//宽度

       UINT             Height//高度

       UINT             MipLevels//渐进等级数.1多重采样,0,自动

       UINT             ArraySize// texture数量

       DXGI_FORMAT      Format//格式

       DXGI_SAMPLE_DESCSampleDesc//多重采样参数

       D3D11_USAGE      Usage//读写标识符

       UINT             BindFlags//渲染管线绑定状态

       UINT             CPUAccessFlags//CPU访问权限,0否定

       UINT             MiscFlags//杂项

} D3D11_TEXTURE2D_DESC;

D3D11_SUBRESOURCE_DATA

ID3D11Device::CreateBuffer,

ID3D11Device::CreateTexture1D,

ID3D11Device::CreateTexture2D,

ID3D11Device::CreateTexture3DpInitialData参数.

typedefstructD3D11_SUBRESOURCE_DATA {

       constvoid *pSysMem//数据地址

       UINT       SysMemPitch//一行像素字节数

       UINT       SysMemSlicePitch//一层像素字节数,仅用于3D纹理

} D3D11_SUBRESOURCE_DATA;

D3D11_USAGE

D3D11_TEXTURE1D_DESC,

D3D11_TEXTURE2D_DESC,

D3D11_TEXTURE3D_DESC,

D3D11_BUFFER_DESC 中的Usage参数,标志资源是否可被CPU或GPU访问

 

typedefenumD3D11_USAGE

{

       D3D11_USAGE_DEFAULT = 0,  // GPU读写

       D3D11_USAGE_IMMUTABLE = 1,  //GPU只读,CPU不可访问.必须在创建时

                                       //初始化, 之后不可改变

       D3D11_USAGE_DYNAMIC = 2,  // GPU 只读, CPU只写.更新使用Map()

       D3D11_USAGE_STAGING = 3   //支持GPUCPU拷贝数据

} D3D11_USAGE;

 

Resource Usage

Default

Dynamic

Immutable

Staging

GPU-Read

yes

yes1

yes

yes1, 2

GPU-Write

yes1

 

 

yes1, 2

CPU-Read

 

 

 

yes1, 2

CPU-Write

 

yes

 

yes1, 2

 

CPU可读用 ID3D11DeviceContext::Map.

GPU可读用 ID3D11DeviceContext::CopySubresourceRegion, ID3D11DeviceContext::CopyResource,ID3D11DeviceContext::UpdateSubresource.  

·      1 - ID3D11DeviceContext::CopySubresourceRegion, ID3D11DeviceContext::CopyResource ID3D11DeviceContext::CopyStructureCount使用时受限制.

·      2 -不能用于深度缓存和多重采样渲染目标

为了性能最大化,并不是所有资源用法选项都可以用作渲染管线的输入或输出。此表列出了这些限制。

Resource Can Be Bound As

Default

Dynamic

Immutable

Staging

Input to a Stage

yes3

yes4

yes

 

Output from a Stage

yes3

 

 

 

      

·      如果多个视图用于输入输出,视图之间不能共用subresources.

·      只可以用单一的subresource创建资源。该资源不能为texture array。资源不能有渐进

ID3D11Device::CreateTexture2D

HRESULTCreateTexture2D(

       [in]   constD3D11_TEXTURE2D_DESC *pDesc,  //纹理描述

       [in]   constD3D11_SUBRESOURCE_DATA *pInitialData,  //初始资源

       [outID3D11Texture2D **ppTexture2D  //输出的Texture

       );

 

如果资源是 multisampled, pInitialData 必须为 NULL 因为multisampled 资源在创建时不能用数据初始化.

ppTexture2D设为null用于检测其他参数(通过返回S_FALSE)

CreateTexture2D 创建一个可以包含若干2Dsubresources的2D 纹理资源。纹理的数量是纹理描述中指定的。所有纹理资源中的必须都具有相同的格式、 大小和mipmap 级别数。

所有资源都由一个或多个的子资源组成。要将数据加载到纹理,应用程序要初始化pInitialData 。

ID3D11DeviceContext::Map

获取subresource中数据的指针,同时拒绝GPU读取.

HRESULTMap(

       ID3D11Resource *pResource//资源

       UINTSubresource,           // subresource索引

       D3D11_MAPMapType,      //CPU读写权限

       UINTMapFlags,            //说明CPUGPU忙时的行为,此参数可选

       D3D11_MAPPED_SUBRESOURCE *pMappedResource  //源数据

       );

对deferred context Map(),只能使用D3D11_MAP_WRITE_DISCARD或D3D11_MAP_WRITE_NO_OVERWRITE,其他不支持.

D3D11_MAPPED_SUBRESOURCE

ID3D11DeviceContext::Map时使用的源数据

typedefstructD3D11_MAPPED_SUBRESOURCE {

       void *pData//数据地址

       UINTRowPitch//一行像素字节数

       UINTDepthPitch; //一层像素字节数,仅用于3D纹理

} D3D11_MAPPED_SUBRESOURCE;

D3D11_MAP

ID3D11DeviceContext::Map的MapType 参数,CPU读写标识符,可组合

typedefenumD3D11_MAP {

       D3D11_MAP_READ = 1,  //,前提D3D11_CPU_ACCESS_READ

       D3D11_MAP_WRITE = 2,  //,前提D3D11_CPU_ACCESS_WRITE

       D3D11_MAP_READ_WRITE = 3,  //读写,前提

                                                               //D3D11_CPU_ACCESS_READ和                                                                        //D3D11_CPU_ACCESS_WRITE

       D3D11_MAP_WRITE_DISCARD = 4,  //,正在使用的数据被覆盖.                                                            //D3D11_CPU_ACCESS_WRITE

                                                        //D3D11_USAGE_DYNAMIC

       D3D11_MAP_WRITE_NO_OVERWRITE = 5  //,但不覆盖正在使用的数据.只用于vertex 和 indexbuffers.前提D3D11_CPU_ACCESS_WRITE,不能使用D3D11_BIND_CONSTANT_BUFFER

} D3D11_MAP;

 

D3D11_MAP_WRITE_DISCARD和 D3D11_MAP_WRITE_NO_OVERWRITE主要用于动态顶点/索引缓存的数据上传.

ID3D11DeviceContext::UpdateSubresource

CPU将内存数据拷贝到subresource

voidUpdateSubresource(

       [in]  ID3D11Resource *pDstResource,  //目标资源

       [in]  UINT DstSubresource,  // zero-based index into an array of subresource

       [in]  constD3D11_BOX *pDstBox//资源需要更新的部分,NULL全部更新

       [in]  constvoid *pSrcData,  //源数据地址

       [in]  UINT SrcRowPitch,  //一行数据字节数

       [in]  UINT SrcDepthPitch //一层数据字节数

        );

对于shader-constant buffer,pDstBox应为NULL.不可以使用该函数对shader-constant buffer进行不完全更新

不可用于以下几种资源:

·      资源用D3D11_USAGE_IMMUTABLE标识符创建.

·      资源为深度缓存.

·      资源为多重采样设置

UpdateSubresource返回后可以更改或释放pSrcData,因为资源已被拷贝走了.

当有资源争夺,例如正在渲染某个vertex buffer时UpdateSubresource这个vertex buffer, UpdateSubresource 性能将降低.此时UpdateSubresource将资源拷贝2次(正常1次).

ID3D11Device::CreateBuffer

创建vertex buffer, index buffer, shader-constant buffer.

HRESULTCreateBuffer(

       [in]   constD3D11_BUFFER_DESC *pDesc,  //buffer描述

       [in]   constD3D11_SUBRESOURCE_DATA *pInitialData,  //初始化数据,NULL只分配内存,                               //usage 标识符为 D3D11_USAGE_IMMUTABLE时不能为NULL

       [outID3D11Buffer **ppBuffer  //缓存地址,NULL测试其他参数是否有效(S_FALSE)

D3D11_BUFFER_DESC

typedefstructD3D11_BUFFER_DESC {

       UINT        ByteWidth//大小

       D3D11_USAGEUsage//用法

       UINT        BindFlags//绑定方式

       UINT        CPUAccessFlags//CPU访问权限,0不可访问

       UINT        MiscFlags; //杂项,可为0

       UINT        StructureByteStride//Structurebuffer大小,如果创建Structurebuffer

} D3D11_BUFFER_DESC;

如果 BindFlags 为D3D11_BIND_CONSTANT_BUFFER , ByteWidth 值必须是16的倍数,并且小于等于D3D11_REQ_CONSTANT_BUFFER_ELEMENT_COUNT.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值