Коррупция D3D11: нормально ли для дубликатов, но идентичных состояний DX11, вызвать коррупцию, если одна копия выпускаетC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Коррупция D3D11: нормально ли для дубликатов, но идентичных состояний DX11, вызвать коррупцию, если одна копия выпускает

Сообщение Anonymous »

Я строю небольшой рендеринг Direct3d 11 в c# с использованием terrafx.interop.windows. < /p>
Моя структура рендеринга выглядит следующим образом: < /p>

Код: Выделить всё

class Scene
{
MeshCollection meshes;
OtherDrawableCollection others;

public void Draw(RenderContext context)
{
meshes.Draw(context);
others.Draw(context);
}
}

class MeshCollection : IRenderable
{
List Items;

public void Draw(RenderContext context)
{
foreach (var mesh in Items)
{
var rs = mesh.IsBackFaceCulling
? context.States.SolidBackCulling
: context.States.SolidNoCulling;

context.Graphics.SetRasterizerState(rs.Get());
context.Graphics.Draw(mesh);
}
}
}

// A helper holding shared, reusable state objects
class CommonStates : IDisposable
{
private ComPtr _solidBackCulling;
private ComPtr _solidNoCulling;

public ComPtr SolidBackCulling => _solidBackCulling;
public ComPtr SolidNoCulling => _solidNoCulling;

public void Initialize(GraphicsDevice device)
{
device.CreateRasterizerState(RasterizerDescs.Solid, _solidNoCulling.GetAddressOf());
device.CreateRasterizerState(RasterizerDescs.SolidBack, _solidBackCulling.GetAddressOf());
}

public void Dispose()
{
_solidBackCulling.Dispose();
_solidNoCulling.Dispose();
}
}
Первоначально у меня была другая коллекция, создавая собственное состояние растификатора, даже если оно было идентично одним из Commonstates :

Код: Выделить всё

    class OtherDrawableCollection : IRenderable, IDisposable
{
ResourceHandle _customState;

public void Initialize(RenderContext context)
{
// Creates a new rasterizer state, same as CommonStates.SolidNoCulling
_customState = context.Graphics.CreateRasterizerState(RasterizerDescs.Solid);
}

public void Draw(RenderContext context)
{
foreach (var drawable in Items)
{
context.Graphics.SetRasterizerState(_customState.Get());
context.Graphics.Draw(drawable);
}
}

public void Dispose() => _customState?.Dispose();
}
class ResourceHandle : IDisposable where T : unmanaged, ID3D11DeviceChild.Interface
{
private ComPtr _resource;

public unsafe T* Get() => _resource.Get();

public ResourceHandle(ComPtr resource)
{
if (resource.Get() == null)
throw new ArgumentNullException(nameof(resource));

_resource = resource;
}

public void Dispose()
{
_resource.Dispose();
}
}
Проблема
Когда я заменяю текущую сцену, я распоряжаю все коллекции и ресурсы, а затем загружаю новые данные сцены. В этот момент я получаю: < /p>

Код: Выделить всё

D3D11 CORRUPTION: ID3D11DeviceContext::RSSetState: First parameter corrupt
System.Runtime.InteropServices.SEHException (0x80004005): External component has thrown an exception.
При попытке осмотреть нативный адрес указателя для состояния растификатора в Commonstates Я обнаружил, что он немного изменился после перезагрузки сцены NE

Код: Выделить всё

RSSetState ptr=0x2648DE2B630   // before loading new scene
RSSetState ptr=0x2648DE2A190   // after reload → crash
после того, как я удалил resourcehandle _customstate; из иначе и disiondrawablecollection и повторно используется Commonstates.solidnoculling Вместо этого), аварий ушел. Государственные объекты, но я не понимаю, почему утилизация одного ресурса испортит другой, даже если они были созданы с идентичными дескрипторами. Чтобы добавить, что у меня была эта установка на некоторое время, но ошибка появилась только недавно, я не помню, что я внес какие -либо изменения в создании ресурсов, чтобы это начало происходить.

Подробнее здесь: https://stackoverflow.com/questions/797 ... to-cause-c
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Коррупция D3D11: нормально ли для дубликатов, но идентичных состояний DX11, вызвать коррупцию, если одна копия выпускает
    Anonymous » » в форуме C#
    0 Ответы
    1 Просмотры
    Последнее сообщение Anonymous
  • (WIN32) Переключение с Vulkan на D3D11 Renderer не выпускает окно
    Anonymous » » в форуме C++
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • (WIN32) Переключение с Vulkan на D3D11 рендерер не выпускает окно [закрыто]
    Anonymous » » в форуме C++
    0 Ответы
    1 Просмотры
    Последнее сообщение Anonymous
  • (WIN32) Переключение с Vulkan на D3D11 Renderer не выпускает окно
    Anonymous » » в форуме C++
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Это мелкая копия или глубокая копия? [закрыто]
    Anonymous » » в форуме C++
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»