Branimir Karadžić 8 лет назад
Родитель
Сommit
11d0ec5dd1
2 измененных файлов с 44 добавлено и 9 удалено
  1. 41 8
      src/renderer_d3d12.cpp
  2. 3 1
      src/renderer_d3d12.h

+ 41 - 8
src/renderer_d3d12.cpp

@@ -381,6 +381,7 @@ namespace bgfx { namespace d3d12
 		enum Enum
 		{
 			Default,
+			Texture,
 			Upload,
 			ReadBack,
 
@@ -391,14 +392,31 @@ namespace bgfx { namespace d3d12
 		D3D12_RESOURCE_STATES m_state;
 	};
 
-	static const HeapProperty s_heapProperties[] =
+	static HeapProperty s_heapProperties[] =
 	{
-		{ { D3D12_HEAP_TYPE_DEFAULT,  D3D12_CPU_PAGE_PROPERTY_UNKNOWN, D3D12_MEMORY_POOL_UNKNOWN, 1, 1 }, D3D12_RESOURCE_STATE_COMMON       },
-		{ { D3D12_HEAP_TYPE_UPLOAD,   D3D12_CPU_PAGE_PROPERTY_UNKNOWN, D3D12_MEMORY_POOL_UNKNOWN, 1, 1 }, D3D12_RESOURCE_STATE_GENERIC_READ },
-		{ { D3D12_HEAP_TYPE_READBACK, D3D12_CPU_PAGE_PROPERTY_UNKNOWN, D3D12_MEMORY_POOL_UNKNOWN, 1, 1 }, D3D12_RESOURCE_STATE_COPY_DEST    },
+		{ { D3D12_HEAP_TYPE_DEFAULT,  D3D12_CPU_PAGE_PROPERTY_UNKNOWN, D3D12_MEMORY_POOL_UNKNOWN, 0, 0 }, D3D12_RESOURCE_STATE_COMMON       },
+		{ { D3D12_HEAP_TYPE_DEFAULT,  D3D12_CPU_PAGE_PROPERTY_UNKNOWN, D3D12_MEMORY_POOL_UNKNOWN, 0, 0 }, D3D12_RESOURCE_STATE_COMMON       },
+		{ { D3D12_HEAP_TYPE_UPLOAD,   D3D12_CPU_PAGE_PROPERTY_UNKNOWN, D3D12_MEMORY_POOL_UNKNOWN, 0, 0 }, D3D12_RESOURCE_STATE_GENERIC_READ },
+		{ { D3D12_HEAP_TYPE_READBACK, D3D12_CPU_PAGE_PROPERTY_UNKNOWN, D3D12_MEMORY_POOL_UNKNOWN, 0, 0 }, D3D12_RESOURCE_STATE_COPY_DEST    },
 	};
 	BX_STATIC_ASSERT(BX_COUNTOF(s_heapProperties) == HeapProperty::Count);
 
+	static void initHeapProperties(ID3D12Device* _device, D3D12_HEAP_PROPERTIES& _properties)
+	{
+		if (D3D12_HEAP_TYPE_CUSTOM != _properties.Type)
+		{
+			_properties = _device->GetCustomHeapProperties(1, _properties.Type);
+		}
+	}
+
+	static void initHeapProperties(ID3D12Device* _device)
+	{
+		initHeapProperties(_device, s_heapProperties[HeapProperty::Default ].m_properties);
+		initHeapProperties(_device, s_heapProperties[HeapProperty::Texture ].m_properties);
+		initHeapProperties(_device, s_heapProperties[HeapProperty::Upload  ].m_properties);
+		initHeapProperties(_device, s_heapProperties[HeapProperty::ReadBack].m_properties);
+	}
+
 	ID3D12Resource* createCommittedResource(ID3D12Device* _device, HeapProperty::Enum _heapProperty, D3D12_RESOURCE_DESC* _resourceDesc, D3D12_CLEAR_VALUE* _clearValue)
 	{
 		const HeapProperty& heapProperty = s_heapProperties[_heapProperty];
@@ -874,6 +892,8 @@ namespace bgfx { namespace d3d12
 			BX_TRACE("\tCrossNodeSharingTier %d", m_options.CrossNodeSharingTier);
 			BX_TRACE("\tResourceHeapTier %d", m_options.ResourceHeapTier);
 
+			initHeapProperties(m_device);
+
 			m_cmd.init(m_device);
 			errorState = ErrorState::CreatedCommandQueue;
 
@@ -1492,8 +1512,7 @@ namespace bgfx { namespace d3d12
 
 		void* createTexture(TextureHandle _handle, Memory* _mem, uint32_t _flags, uint8_t _skip) override
 		{
-			m_textures[_handle.idx].create(_mem, _flags, _skip);
-			return NULL;
+			return m_textures[_handle.idx].create(_mem, _flags, _skip);
 		}
 
 		void updateTextureBegin(TextureHandle /*_handle*/, uint8_t /*_side*/, uint8_t /*_mip*/) override
@@ -4103,7 +4122,7 @@ data.NumQualityLevels = 0;
 		bx::read(&reader, m_size);
 	}
 
-	void TextureD3D12::create(const Memory* _mem, uint32_t _flags, uint8_t _skip)
+	void* TextureD3D12::create(const Memory* _mem, uint32_t _flags, uint8_t _skip)
 	{
 		bimg::ImageContainer imageContainer;
 
@@ -4415,7 +4434,13 @@ data.NumQualityLevels = 0;
 				break;
 			}
 
-			m_ptr = createCommittedResource(device, HeapProperty::Default, &resourceDesc, clearValue);
+			m_ptr = createCommittedResource(device, HeapProperty::Texture, &resourceDesc, clearValue);
+
+			if (kk != 0)
+			{
+//				void* directAccessPtr;
+//				DX_CHECK(m_ptr->Map(0, NULL, &directAccessPtr) );
+			}
 
 			{
 				uint64_t uploadBufferSize;
@@ -4479,12 +4504,20 @@ data.NumQualityLevels = 0;
 				}
 			}
 		}
+
+		return m_directAccessPtr;
 	}
 
 	void TextureD3D12::destroy()
 	{
 		if (NULL != m_ptr)
 		{
+			if (NULL != m_directAccessPtr)
+			{
+				m_ptr->Unmap(0, NULL);
+				m_directAccessPtr = NULL;
+			}
+
 			s_renderD3D12->m_cmd.release(m_ptr);
 			m_ptr = NULL;
 		}

+ 3 - 1
src/renderer_d3d12.h

@@ -268,6 +268,7 @@ namespace bgfx { namespace d3d12
 
 		TextureD3D12()
 			: m_ptr(NULL)
+			, m_directAccessPtr(NULL)
 			, m_state(D3D12_RESOURCE_STATE_COMMON)
 			, m_numMips(0)
 		{
@@ -275,7 +276,7 @@ namespace bgfx { namespace d3d12
 			bx::memSet(&m_uavd, 0, sizeof(m_uavd) );
 		}
 
-		void create(const Memory* _mem, uint32_t _flags, uint8_t _skip);
+		void* create(const Memory* _mem, uint32_t _flags, uint8_t _skip);
 		void destroy();
 		void update(ID3D12GraphicsCommandList* _commandList, uint8_t _side, uint8_t _mip, const Rect& _rect, uint16_t _z, uint16_t _depth, uint16_t _pitch, const Memory* _mem);
 		void resolve();
@@ -284,6 +285,7 @@ namespace bgfx { namespace d3d12
 		D3D12_SHADER_RESOURCE_VIEW_DESC  m_srvd;
 		D3D12_UNORDERED_ACCESS_VIEW_DESC m_uavd;
 		ID3D12Resource* m_ptr;
+		void* m_directAccessPtr;
 		D3D12_RESOURCE_STATES m_state;
 		uint32_t m_flags;
 		uint32_t m_width;