Выделение 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);
Исключение во время выполнения:
Ошибка проверки времени выполнения # 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 и установил его как ответ.