Войти
ПрограммированиеФорумГрафика

Directx 12 вопросы. (4 стр)

Страницы: 13 4 5 613 Следующая »
#45
13:41, 3 дек. 2019

Marmilad
Могу перегрузится, проверить. кинь кусок кода, а на Windows 10 работает?


#46
(Правка: 14:55) 14:54, 3 дек. 2019

чорд, я надеялся, что это срейтрейшенный треугольник, а не выведенный убогой растеризацией.
:trollface:

#47
14:59, 3 дек. 2019

HolyDel
> чорд, я надеялся, что это срейтрейшенный треугольник,
ну это через годик другой :)

#48
(Правка: 23:55) 23:54, 3 дек. 2019

Поясните мне один момент. В библиотеке которую я использую для рендера все вызовы методов из интерфейсов DirectX обрамлены вот так:

  PushClearFPUState;
  try
    .. some directx stuff called
  finally
    PopFPUState;
  end;

и дано вот такое пояснение:
{ Similarly to @link(PushFPUState), this saves the current FPU state to stack and increments
internal stack pointer. Afterwards, this function disables all FPU exceptions. This is typically
used with Direct3D rendering methods that require FPU exceptions to be disabled. }
procedure PushClearFPUState;

Хучь убейся ничего не нашел насчет необходимости очистки флагов исключений сопроцессора. И хотя автор движка уж точно поумнее меня, однако гложут смутные сомнения, а нахера нужон этот просер ресурса?  Для теста поставил заглушки все работало как обычно.

Ваше мнение по этому поводу, господа?

#49
0:51, 4 дек. 2019

DelphiRunner
> И хотя автор движка уж точно поумнее меня, однако гложут смутные сомнения, а
> нахера нужон этот просер ресурса?
Да норкоман автор. Выкинь эту библиотеку. Флаги достаточно выставлять один раз перед работой с DX, а не на каждый колл выставлять/восстанавливать.

#50
9:28, 10 дек. 2019

Кто то встречал примеры рендера shadow map в параллельном треде?
А то Юнити хвалятся что так быстрее чуть ли не в 2 раза.
По сравнению с последовательным рендером теней(с начало тени потом объекты с тенью)

#51
9:47, 10 дек. 2019

Marmilad
> А то Юнити хвалятся что так быстрее чуть ли не в 2 раза.
Значит у юнити ботлнек - это CPU. Нашли чем хвастаться, лол. :)

#52
11:12, 10 дек. 2019

В Юнити возможно :)

#53
(Правка: 11:15) 11:13, 10 дек. 2019

MrShoor

На юнити Миша Актон вот уже который год собирается DOTS завезти, с ECS и сишарпными оптимизирующими гейшами.

Правда им для этого пришлось превратить шарпей практически в кресты стандарта 98, но это так, мелочи.

#54
11:19, 10 дек. 2019

Прям анекDOTS :)

#55
(Правка: 19:50) 19:48, 10 дек. 2019

Dxt5 как загрузить?
Делаю формат dxgi_format_bc3_unorm
Но вот не хочет копировать в GPU текстуру так.
При формате dxgi_format_R8G8B8A8_unorm заливает на ГПУ, но текстура выглядит как куча разноцветных пикселей.
Что делаю не так?

#56
21:54, 10 дек. 2019

Marmilad
> Но вот не хочет копировать в GPU текстуру так.
не понял, как не хочешь?

#57
(Правка: 5:52) 4:51, 11 дек. 2019

Белый экран после копирования BC3_unorm
Как я понял я не верно для этого формата считаю RowPitch для footprints.
И не создаётся texture2D с BC3_unorm и miplevels =1 и размером 512х512

#58
9:39, 11 дек. 2019

Marmilad
я писал загрузчик еще для Direct3D9 на основании доков и примера DirectX sdk DDS without d3dx.
подправил на основании https://github.com/Microsoft/DirectXTK/wiki/DDSTextureLoader

Выглядит это так, но смотреть нужно в основном на GetDDSSize:

// ImageToTextureUploader  - общий интерфейс для развязки форматов 
// файлов и текстур от конкретной реализации для Direct3D/Vulkan/OpenGL
class Direct3D12TextureUploader : public ImageToTextureUploader {
...
    virtual void UploadTextureData(..., const ubyte* data, uint rowBytes)
    {
// пойдет потом для функции UpdateSubresources
      D3D12_SUBRESOURCE_DATA& textureData = subresourcesData.push_back();
      textureData.pData = data;
      textureData.RowPitch = rowBytes;
      textureData.SlicePitch = textureData.RowPitch * height;
    }
...
};
...
    uint GetDDSSize(uint width, uint height, uint format, uint& rowBytes)
    {
      bool BC4_DXT1 = BC4U == format || BC4S == format || DXT1 == format;
      uint bpe = BC4_DXT1 ? 8 : 16;

      assert(width && "Invalid Value");
      uint numBlocksWide = std::max<uint>(1, (width + 3) / 4);
      
      assert(height && "Invalid Value");
      uint numBlocksHigh = std::max<uint>(1, (height + 3) / 4);
      
      rowBytes = numBlocksWide * bpe;
      uint numBytes = rowBytes * numBlocksHigh;
      return numBytes;
    }
...
bool Image::LoadFromDDS(..., ImageToTextureUploader* imageToTextureUploader)
{
...
  for (uint i = 0; i < numMipmaps && (w || h); ++i) {
    uint rowBytes = 0;
    uint size = Helper::GetSize(w, h, format, rowBytes);
    imageToTextureUploader->UploadTextureData(..., data, rowBytes);
    data += size;

    w = ClampSize(w >>= 1);
    h = ClampSize(h >>= 1);
  }
...
}

#59
13:36, 11 дек. 2019

Внезапно у меня возник вопрос про синхронизацию очередей в Direct3D 12.
Имеется вот такой код (это упрощенный пример, который бесполезен в реальном приложении):

+ Показать

DX Debug плюётся предупреждениями:

D3D12 ERROR: ID3D12CommandQueue::ExecuteCommandLists: Non-simultaneous-access Texture Resource (0x0000013F9A629EF0:'Unnamed Object') is still referenced by write|transition_barrier GPU operations in-flight on another Command Queue (0x0000013F971B0110:'Unnamed ID3D12CommandQueue Object'). It is not safe to start read GPU operations now on this Command Queue (0x0000013F972BAB80:'Unnamed ID3D12CommandQueue Object'). This can result in race conditions and application instability. [ EXECUTION ERROR #1047: OBJECT_ACCESSED_WHILE_STILL_IN_USE]
D3D12 ERROR: ID3D12CommandQueue::ExecuteCommandLists: Non-simultaneous-access Texture Resource (0x0000013F9A6216A0:'Unnamed Object') is still referenced by read GPU operations in-flight on another Command Queue (0x0000013F972BAB80:'Unnamed ID3D12CommandQueue Object'). It is not safe to start write|transition_barrier GPU operations now on this Command Queue (0x0000013F971B0110:'Unnamed ID3D12CommandQueue Object'). This can result in race conditions and application instability. [ EXECUTION ERROR #1047: OBJECT_ACCESSED_WHILE_STILL_IN_USE]

Возникает вопрос: какого чёрта? Я же жду фенса на вычислительной очереди, поэтому барьер в графической очереди должен закончиться перед тем, как начнётся копирование!

Если я не опускаю фенс до нуля:

+ Показать

Либо опускаю, но использую разную пару фенсов для чётных и нечётных кадров:
+ Показать

то предупреждений уже нет. Но я всё равно теперь не могу быть уверенным в правильности последних двух вариантов.
Как же всё-таки правильно синхронизировать очереди в Direct3D 12?

Страницы: 13 4 5 613 Следующая »
ПрограммированиеФорумГрафика