Выделение EGLRenderResolutionScaleProperty в ANGLE из C # с использованием P / Invoke

Я пытаюсь заставить ANGLE работать в C #, используя P / Invoke. По сути, я создаю простую 2D-поверхность, а затем передаю ее Skia (используя SkiaSharp). Все работает и все такое, но у меня проблема с сортировкойPropertySet в неуправляемый код.

Этот бит отлично работает:

// the properties
var props = new PropertySet();
props.Add("EGLNativeWindowTypeProperty", swapChainPanel);
// the surface attributes
int[] surfaceAttrs = {
    EGL_ANGLE_SURFACE_RENDER_TO_BACK_BUFFER, EGL_TRUE,
    EGL_NONE
};

// create the surface
surface = eglCreateWindowSurface(eglDisplay, eglConfig, props, surfaceAttrs);

Мой импорт выглядит так:

[DllImport("libEGL.dll")]
public static extern IntPtr eglCreateWindowSurface(
    IntPtr dpy, 
    IntPtr config, 
    [MarshalAs(UnmanagedType.IInspectable)] object win, 
    int[] attrib_list);

Проблема возникает, когда я пытаюсь настроить масштабирование для экранов с высоким разрешением. Это «должно» работать:

var scale = PropertyValue.CreateSingle(2);
props.Add("EGLRenderResolutionScaleProperty", scale);

Это работает при использовании C ++, но не в C #. Я думаю, что я объяснил это тем фактом, что фактическое значение не правильно распределено. Это потому, что при отладке в коде ANGLE он умирает здесь:

ComPtr<ABI::Windows::Foundation::IPropertyValue> propertyValue;
ABI::Windows::Foundation::PropertyType propertyType;
// ... 
result = propertyValue->get_Type(&propertyType);

https://github.com/Microsoft/angle/blob/54b1fd01f7fddcd7011d5a04e9259edace8a13da/src/libANGLE/renderer/d3d/d3d11/winrt/InspectableNativeWindow.cpp#L242

Исключение во время выполнения:

Ошибка проверки времени выполнения # 0 - значение ESP не было должным образом сохранено при вызове функции. Это обычно является результатом вызова функции, объявленной с одним соглашением о вызовах с указателем функции, объявленным с другим соглашением о вызовах.

Есть какие-нибудь советы или решения?

Вот весь мой код для справки:https://gist.github.com/mattleibow/eacb9c9e87f306b218d99c713c532a82

Оригинальная проблема ANGLE:https://github.com/Microsoft/angle/issues/89

РЕДАКТИРОВАТЬ

После дальнейшего расследования я обнаружил, что по какой-то причинеPropertyValue в C # отличается от того же типа в C ++ (через компонент времени выполнения Windows).

Я попробовал это:

static PropertySet^ CreateSurface(SwapChainPanel^ panel, float scale)
{
    PropertySet^ surfaceCreationProperties = ref new PropertySet();
    surfaceCreationProperties->Insert(L"EGLNativeWindowTypeProperty", panel);
    Object^ scaleVal = PropertyValue::CreateSingle(scale);
    surfaceCreationProperties->Insert(L"EGLRenderResolutionScaleProperty", scaleVal);
    return surfaceCreationProperties;
}

Этот метод создалPropertySet в C ++, а затем возвращает это в C #. Это работает отлично, и мой сессия ANGLE все хорошо.

Теперь, если я изменю код, чтобы вернутьPropertyValue::CreateSingle(scale) напрямую, это снова не удается. Если я передамPropertyValue.CreateSingle(scale) из C # в этот метод C ++, я обнаружил, что объекты не похожи.

В локальных местах отладчика я получаю это для объекта, созданного в C #:

0x09f10ba4 <Information not available, no symbols loaded for coreclr.dll>
Platform::Object ^

Если объект построен в C ++, я получаю это:

0x019162e8 2.00000000
Platform::Object ^ {WinTypes.dll!Windows::Foundation::Value<Windows::Foundation::ValueScalar<float> >}

Разве объект не должен быть одинаковым, поскольку они одного типа? Что более страшно, так это то, что если я передам это значение через границу, тип изменится.

Убрал редактирование 2 и установил его как ответ.

Ответы на вопрос(2)

Ваш ответ на вопрос