in shiny/driver/gldriver/win32.go [236:354]
func createEGLSurface(hwnd syscall.Handle, w *windowImpl) error {
var displayAttribPlatforms = [][]eglInt{
// Default
[]eglInt{
_EGL_PLATFORM_ANGLE_TYPE_ANGLE,
_EGL_PLATFORM_ANGLE_TYPE_DEFAULT_ANGLE,
_EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, _EGL_DONT_CARE,
_EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE, _EGL_DONT_CARE,
_EGL_NONE,
},
// Direct3D 11
[]eglInt{
_EGL_PLATFORM_ANGLE_TYPE_ANGLE,
_EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE,
_EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, _EGL_DONT_CARE,
_EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE, _EGL_DONT_CARE,
_EGL_NONE,
},
// Direct3D 9
[]eglInt{
_EGL_PLATFORM_ANGLE_TYPE_ANGLE,
_EGL_PLATFORM_ANGLE_TYPE_D3D9_ANGLE,
_EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, _EGL_DONT_CARE,
_EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE, _EGL_DONT_CARE,
_EGL_NONE,
},
// Direct3D 11 with WARP
// https://msdn.microsoft.com/en-us/library/windows/desktop/gg615082.aspx
[]eglInt{
_EGL_PLATFORM_ANGLE_TYPE_ANGLE,
_EGL_PLATFORM_ANGLE_TYPE_D3D11_ANGLE,
_EGL_PLATFORM_ANGLE_DEVICE_TYPE_ANGLE,
_EGL_PLATFORM_ANGLE_DEVICE_TYPE_WARP_ANGLE,
_EGL_PLATFORM_ANGLE_MAX_VERSION_MAJOR_ANGLE, _EGL_DONT_CARE,
_EGL_PLATFORM_ANGLE_MAX_VERSION_MINOR_ANGLE, _EGL_DONT_CARE,
_EGL_NONE,
},
}
dc, err := win32.GetDC(hwnd)
if err != nil {
return fmt.Errorf("win32.GetDC failed: %v", err)
}
var display uintptr = _EGL_NO_DISPLAY
for i, displayAttrib := range displayAttribPlatforms {
lastTry := i == len(displayAttribPlatforms)-1
display, _, _ = eglGetPlatformDisplayEXT.Call(
_EGL_PLATFORM_ANGLE_ANGLE,
uintptr(dc),
uintptr(unsafe.Pointer(&displayAttrib[0])),
)
if display == _EGL_NO_DISPLAY {
if !lastTry {
continue
}
return fmt.Errorf("eglGetPlatformDisplayEXT failed: %v", eglErr())
}
if ret, _, _ := eglInitialize.Call(display, 0, 0); ret == 0 {
if !lastTry {
continue
}
return fmt.Errorf("eglInitialize failed: %v", eglErr())
}
}
eglBindAPI.Call(_EGL_OPENGL_ES_API)
if err := eglErr(); err != nil {
return err
}
var numConfigs eglInt
var config eglConfig
ret, _, _ := eglChooseConfig.Call(
display,
uintptr(unsafe.Pointer(&rgb888[0])),
uintptr(unsafe.Pointer(&config)),
1,
uintptr(unsafe.Pointer(&numConfigs)),
)
if ret == 0 {
return fmt.Errorf("eglChooseConfig failed: %v", eglErr())
}
if numConfigs <= 0 {
return errors.New("eglChooseConfig found no valid config")
}
surface, _, _ := eglCreateWindowSurface.Call(display, uintptr(config), uintptr(hwnd), 0, 0)
if surface == _EGL_NO_SURFACE {
return fmt.Errorf("eglCreateWindowSurface failed: %v", eglErr())
}
contextAttribs := [...]eglInt{
_EGL_CONTEXT_CLIENT_VERSION, 2,
_EGL_NONE,
}
context, _, _ := eglCreateContext.Call(
display,
uintptr(config),
_EGL_NO_CONTEXT,
uintptr(unsafe.Pointer(&contextAttribs[0])),
)
if context == _EGL_NO_CONTEXT {
return fmt.Errorf("eglCreateContext failed: %v", eglErr())
}
eglSwapInterval.Call(display, 1)
w.ctx = ctxWin32{
ctx: context,
display: display,
surface: surface,
}
return nil
}