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_TEXTURE3D_DESC
的
CPUAccessFlags
参数
.
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_TEXTURE3D_DESC的MiscFlags参数, 不常用的标识符.
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
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::CreateTexture1D,
ID3D11Device::CreateTexture2D,
ID3D11Device::CreateTexture3D的pInitialData参数.
typedefstructD3D11_SUBRESOURCE_DATA {
constvoid *pSysMem; //数据地址
UINT SysMemPitch; //一行像素字节数
UINT SysMemSlicePitch; //一层像素字节数,仅用于3D纹理
} D3D11_SUBRESOURCE_DATA;
D3D11_USAGE
D3D11_BUFFER_DESC 中的Usage参数,标志资源是否可被CPU或GPU访问
{
D3D11_USAGE_DEFAULT = 0, // GPU读写
D3D11_USAGE_IMMUTABLE = 1, //GPU只读,CPU不可访问.必须在创建时
//初始化, 之后不可改变
D3D11_USAGE_DYNAMIC = 2, // GPU 只读, CPU只写.更新使用Map()
D3D11_USAGE_STAGING = 3 //支持GPU向CPU拷贝数据
} 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, //初始资源
[out] ID3D11Texture2D **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, //说明CPU在GPU忙时的行为,此参数可选
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_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
[out] ID3D11Buffer **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.