Re: [waffle] [GSOC 2014] How to deal with non win32 api, wgl(Create, Make)Context depends on existing window

2014-06-05 Thread Jose Fonseca


- Original Message -
 On Wed, Jun 4, 2014 at 1:18 PM, Jose Fonseca jfons...@vmware.com wrote:
  - Original Message -
  On Sun, May 25, 2014 at 08:00:49PM -0700, Jordan Justen wrote:
   On Sun, May 25, 2014 at 2:43 PM, Emil Velikov emil.l.veli...@gmail.com
   wrote:
On 25/05/14 21:35, Jordan Justen wrote:
On Sat, May 24, 2014 at 12:28 PM, Emil Velikov
emil.l.veli...@gmail.com wrote:
* Library dependencies, etc. (low priority)
libwaffle-1.dll depends on mingw-w64 dlls - should we nuke the
dependency,
ship them in the zip or leave it to the user/dev ?
   
  Library:
libgcc_s
  __emutls_get_address
  __udivdi3
  __umoddi3
   
  Options:
- Static link libgcc_s, generally not bad idea
sigh, a bit of a typo here - the above should read:
   
- Static link libgcc_s - generally _a bad_ idea
  
   Doesn't gcc/binutils automatically do this when you compile/link?
  
What are the licensing implications?
   
That's possibly the main reason why I'm inclined to go with rework.
I've
never
been good at the legal/licensing terms.
   
I think libgcc would be covered by this exception, right?
https://urldefense.proofpoint.com/v1/url?u=https://www.gnu.org/licenses/gcc-exception-3.1-faq.htmlk=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0Ar=NMr9uy2iTjWVixC0wOcYCWEIYhfo80qKwRgdodpoDzA%3D%0Am=0dWLL1eK7zXGaHLwGR8JQNvgR0iR%2BeSjmnMVBlMUMwU%3D%0As=f5e6e804df74284b34407c9df79fcd092ac004d7341177df10dd1859df58f389
   
If so, it seems like static linking might not be a problem.
   
IIUC you are correct. waffle is gpl-compatible (2-clause BSD), and no
gpl-incompatible software is used during the Compilation Process,
thus
we
are Eligible.
  
   It sounds they only mean to prevent non-GPL compatible code from
   getting into the internals of the GCC complication process. So, in
   other words, you can't have a proprietary GCC plugin, and also use the
   exception to link to libgcc, etc.
  
   But, it seems like even proprietary code could use the exception to
   link to libgcc as long as it was just being compiled by GCC.
  
- or, rework waffle ?
  Split merged_version or move to (major  8 | minor) for
  the
  wcore_config_attrs_version_* helpers - will nuke the last
  two.
  No idea how to nuke __emutls_get_address.
   
  Suggestion:
Split to separate major/minor.
   
   
  Library:
 libwinpthread-1
   pthread_key_create
   pthread_mutex_lock
   pthread_mutex_unlock
   pthread_once
   pthread_setspecific
   
  Options:
 - Static link
   
What are the licensing implications?
   
It doesn't look as good as the libgcc case.
   
The library is a combination of X/MIT and 3-clause BSD. Which afaics
is
rather
vague on the topic of static linking the library and distribution of
the
final
binary(ies). My guess is that we ought to be safe but IANAL.
  
   This wasn't my concern. I was concerned the library might have been
   GPL licensed, and thus the waffle DLL wouldn't be usable with a
   proprietary application.
  
   Chad, would you be okay with releasing the windows waffle DLL and
   noting that it is partially covered by X/MIT, 3-clause BSD and
   2-clause BSD?
 
 
  If Waffle needs a stacked license to support Win32, that's ok with me.
  Liberal licenses in the BSD, MIT, and Apache family are all acceptable.
 
  I am not a lawyer either, so I do not know if statically linking the
  parts you speak of are safe to do so. I think you should make your
  initial decision based on its technical merits. Then, after the
  technical, decision is made but before you've invested too much time in
  it, all of us (you, Jordan, me, Jose) should analyze any license issues.
 
  FWIW, I prefer to avoid runtime dependency hell by statically linking
  small, problematic components. But my opinion is of limited value here,
  because I'm unfamiliar with the problem domain of mingw and MSVC.
 
  FWIW, my opinion is that we shouldn't get too distracted by licensing and
  what release binaries should look like.  It is not something that needs to
  be decided now, or ever: ultimately, that decision can be pushed to the
  final user.  They might prefer mingw, they might prefer msvc for easy of
  debugging, or because they want to statically link, etc.
 
 
 I thought we wanted to go ahead an provide a binary build for windows, and
 thus:
 1. It should be buildable under Linux using mingw
 2. The binary should have a reasonable license situation

 Didn't we already pretty much have this worked out anyhow?

Maybe I misinterpreted things.  I always saw mingw as a mean to an end, to 
facilitate development and get things started (ie, without forcing Emil to 
obtain and learn to use use a completely new set of tools).  And not the end 
itself (distribute 

Re: [waffle] [GSOC 2014] How to deal with non win32 api, wgl(Create, Make)Context depends on existing window

2014-06-05 Thread Jose Fonseca


- Original Message -
 
 
 - Original Message -
  On Wed, Jun 4, 2014 at 1:18 PM, Jose Fonseca jfons...@vmware.com wrote:
   - Original Message -
   On Sun, May 25, 2014 at 08:00:49PM -0700, Jordan Justen wrote:
On Sun, May 25, 2014 at 2:43 PM, Emil Velikov
emil.l.veli...@gmail.com
wrote:
 On 25/05/14 21:35, Jordan Justen wrote:
 On Sat, May 24, 2014 at 12:28 PM, Emil Velikov
 emil.l.veli...@gmail.com wrote:
 * Library dependencies, etc. (low priority)
 libwaffle-1.dll depends on mingw-w64 dlls - should we nuke the
 dependency,
 ship them in the zip or leave it to the user/dev ?

   Library:
 libgcc_s
   __emutls_get_address
   __udivdi3
   __umoddi3

   Options:
 - Static link libgcc_s, generally not bad idea
 sigh, a bit of a typo here - the above should read:

 - Static link libgcc_s - generally _a bad_ idea
   
Doesn't gcc/binutils automatically do this when you compile/link?
   
 What are the licensing implications?

 That's possibly the main reason why I'm inclined to go with rework.
 I've
 never
 been good at the legal/licensing terms.

 I think libgcc would be covered by this exception, right?
 https://urldefense.proofpoint.com/v1/url?u=https://www.gnu.org/licenses/gcc-exception-3.1-faq.htmlk=oIvRg1%2BdGAgOoM1BIlLLqw%3D%3D%0Ar=NMr9uy2iTjWVixC0wOcYCWEIYhfo80qKwRgdodpoDzA%3D%0Am=0dWLL1eK7zXGaHLwGR8JQNvgR0iR%2BeSjmnMVBlMUMwU%3D%0As=f5e6e804df74284b34407c9df79fcd092ac004d7341177df10dd1859df58f389

 If so, it seems like static linking might not be a problem.

 IIUC you are correct. waffle is gpl-compatible (2-clause BSD), and
 no
 gpl-incompatible software is used during the Compilation Process,
 thus
 we
 are Eligible.
   
It sounds they only mean to prevent non-GPL compatible code from
getting into the internals of the GCC complication process. So, in
other words, you can't have a proprietary GCC plugin, and also use the
exception to link to libgcc, etc.
   
But, it seems like even proprietary code could use the exception to
link to libgcc as long as it was just being compiled by GCC.
   
 - or, rework waffle ?
   Split merged_version or move to (major  8 | minor) for
   the
   wcore_config_attrs_version_* helpers - will nuke the
   last
   two.
   No idea how to nuke __emutls_get_address.

   Suggestion:
 Split to separate major/minor.


   Library:
  libwinpthread-1
pthread_key_create
pthread_mutex_lock
pthread_mutex_unlock
pthread_once
pthread_setspecific

   Options:
  - Static link

 What are the licensing implications?

 It doesn't look as good as the libgcc case.

 The library is a combination of X/MIT and 3-clause BSD. Which afaics
 is
 rather
 vague on the topic of static linking the library and distribution of
 the
 final
 binary(ies). My guess is that we ought to be safe but IANAL.
   
This wasn't my concern. I was concerned the library might have been
GPL licensed, and thus the waffle DLL wouldn't be usable with a
proprietary application.
   
Chad, would you be okay with releasing the windows waffle DLL and
noting that it is partially covered by X/MIT, 3-clause BSD and
2-clause BSD?
  
  
   If Waffle needs a stacked license to support Win32, that's ok with me.
   Liberal licenses in the BSD, MIT, and Apache family are all acceptable.
  
   I am not a lawyer either, so I do not know if statically linking the
   parts you speak of are safe to do so. I think you should make your
   initial decision based on its technical merits. Then, after the
   technical, decision is made but before you've invested too much time in
   it, all of us (you, Jordan, me, Jose) should analyze any license issues.
  
   FWIW, I prefer to avoid runtime dependency hell by statically linking
   small, problematic components. But my opinion is of limited value here,
   because I'm unfamiliar with the problem domain of mingw and MSVC.
  
   FWIW, my opinion is that we shouldn't get too distracted by licensing and
   what release binaries should look like.  It is not something that needs
   to
   be decided now, or ever: ultimately, that decision can be pushed to the
   final user.  They might prefer mingw, they might prefer msvc for easy of
   debugging, or because they want to statically link, etc.
  
  
  I thought we wanted to go ahead an provide a binary build for windows, and
  thus:
  1. It should be buildable under Linux using mingw
  2. The binary should have a reasonable license situation
 
  Didn't we already pretty much have this worked out anyhow?
 
 Maybe I misinterpreted things.  I always saw mingw as a mean to an 

Re: [waffle] [GSOC2014] Current design/implementation + the infamous corruption

2014-06-05 Thread Emil Velikov
On 05/06/14 03:19, Emil Velikov wrote:
 Hi all,
 
 Over the last few days I have been though some head-scratching and re-writing
 things, in order to resolve an interesting memory corruption to no avail :'(
 
 Before explaining more about the issue here is some info about the current
 design + where to get the patches. Let me know if you would like me to send
 them to the ML.
 
 Branch GSOC2014 over at https://github.com/evelikov/waffle
 
 Archlinux users can use the pkgbuild script in pkg/archlinux/mingw-w64-waffle.
 
 Design by example - gl_sample.c (i.e. how to use waffle)
 
 waffle_init()
 waffle_display_connect()
 + RegisterClass()// Registers the window class used as a template
  // by Windows to create the window
 
   // Create a default/root window, config and context
   // as wglGetProcAddress needs to be executed under
   // current context.

Missed case:
waffle_get_proc_address()  // if (wglGetCurrentContext() == NULL) {
   // using_display_context = true;
   // wglMakeCurrent(display-hdc, display-hglrc)
   // }
   // ok = wglGetProcAddress()
   // if (using_display_context == true)
   // wglMakeCurrent(NULL, NULL)
   // return ok;

   // Unbinding the current context may be an
   // overkill although will help with unintentional
   // misuse of waffle's API.

   // NOTE: Will need to change waffle's internals
   // in order to get access to wcore_display.
   // The API will need a change to include the
   // display waffle_get_proc_address(dpy, glHam)


 waffle_config_choose(dpy...)
 + CreateWindow() // Create a window and prepend it to the
  // wgl_display::windows list.
 
Now that I look at it, I'm not entirely sure why I needed a list of all
windows in wgl_display. Seems like I can drop that.

 + ChoosePixelFormat()
 + SetPixelFormat()   // Set the pixelformat and link the current window
  // to the wgl_config
 
 waffle_context_create(config...)
 + CreateContext(hDC... ) // At this point we need access to the wgl_window,
  // as hWnd/hDC (window_handle/device_context handle)
  // is essential.
  // This is where wgl_config::window comes into play.
 
 waffle_window_create(config, w, h)
 + wgl_window_resize()// Reuse the window, adjusting it's dimensions, as
  // w, h used at creation time are include the window
  // border. AFAICK there is no way to determine the
  // correct window dimensions prior to creation.
 
 ...
 
 waffle_window_create(config, w, h)
 + waffle_window_resize() // Reuse the window... and boom. Any suggestions on
  // how to resolve this, or should we mandate that
  // this is not a valid usage of waffle ?
 
There is no use case in piglit + waffle{examples/utils} where one would create
multiple windows for a single config. I might just add a lovely assert and
don't worry about this too much.

With the above resolved I will take a look at handling gl profiles and alike.

 
 And now back to the memory corruption:
 
Resolved, thanks to Jon Turney.

The functions obtained by waffle_dl_sym() are part of the Windows API, which
uses different calling convention (stdcall vs cdecl) which causes the heap
corruption. Annotating properly makes the gl_basic test work like a charm.

AFAICS waffle_get_proc_address is in the same boat. Will need to test.

Cheers,
Emil
___
waffle mailing list
waffle@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/waffle


Re: [waffle] [GSOC 2014] How to deal with non win32 api, wgl(Create, Make)Context depends on existing window

2014-06-05 Thread Chad Versace
On Wed, Jun 04, 2014 at 11:47:32PM -0700, Jose Fonseca wrote:

  I thought we wanted to go ahead an provide a binary build for windows, and
  thus:
  1. It should be buildable under Linux using mingw
  2. The binary should have a reasonable license situation
 
  Didn't we already pretty much have this worked out anyhow?
 
 Maybe I misinterpreted things.  I always saw mingw as a mean to an end, to 
 facilitate development and get things started (ie, without forcing Emil to 
 obtain and learn to use use a completely new set of tools).  And not the end 
 itself (distribute binaries to the world), because:
 
  - MinGW often generates bad code, I've seen it happening with Mesa and 
 Apitrace [1]; so I while use MinGW debug binaries all the time, I don't trust 
 MinGW to produce distributable release binaries
  - MinGW debug information is not understood by MSVC tools, so when an MSVC 
 user debugs its code, it won't be able to get any symbols from waffle if 
 waffle was build with MinGW
 
 IMHO, the best sort of binaries are .DLLs produced by MSVC (any version) with 
 statically linked CRT (so no additional dependencies -- no need to ship MSVC 
 redistributables installer).  And they should be usable with applications 
 built with anything (MSVC MinGW)  
 
 Anyway, this is just a mere suggestion.  I can always build my own binaries 
 from source if needed.

Jose, I had the same interpretation as you. Despite being useful for
development, mingw was a mean to an end.
___
waffle mailing list
waffle@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/waffle


Re: [waffle] [GSOC 2014] How to deal with non win32 api, wgl(Create, Make)Context depends on existing window

2014-06-05 Thread Chad Versace
On Wed, Jun 04, 2014 at 01:24:38PM -0700, Jose Fonseca wrote:
 
 
 - Original Message -
  On 02/06/14 19:55, Chad Versace wrote:
   On Sat, May 31, 2014 at 12:02:10PM -0700, Jose Fonseca wrote:
  
  
   - Original Message -
  
  
   - Original Message -
   On 24/05/14 20:28, Emil Velikov wrote:
   Hi all,
  
   Another round of interesting bits and bulbs.
  
   Bit of an update:
  
   The email came out a bit longer than expected, although it provides a
   decent
   list of possible solutions. Let me know which one you'll go with.
  
   Four topics sorted by priority - high to low (based on my humble
   opinion)
  
   * ChoosePixelFormat - close yet quite different across platforms.
  
 - glXChoosePixelFormat- depends on display (matches waffle's
 model).
 - CGLChoosePixelFormat- no dependencies.
 - {wgl,}ChoosePixelFormat - depends on a device_context/existing
 window.
  
   To make things better, wgl functions depend on a current context as
   well.
   The
   recommended way of doing things under windows seems to be the 
   following:
  
  window_handle = CreateWindow(...)
  device_context = GetDC(window_handle);
  
  gl_rendering_context = wglCreateContext(device_context);
  wglMakeCurrent (device_handle, gl_rendering_context);
  
  // any of the following
  wglGetProcAddress(...)
  wglChoosePixelFormat(...)
  
  
  wglMakeCurrent (device_handle, NULL);
  wglDeleteContext (gl_rendering_context);
  
  ReleaseDC(device_context);
  DestroyWindow(window_handle);
  
   Yep.
  
  
  
  
   AFAICS waffle is unique wrt other projects (apitrace, epoxy, glut) as 
   it
   allows the PixelFormat to be called prior to the creation of either
   window
   or
   context.
   
   
   If you could rewrite this problematic portion of Waffle's API, how would
   you design it? I'm asking so that, if we do redesign Waffle's API one
   day, it can better accommodate Windows and Mac.
   
   One requirement of any API redesign, though, is to preserve the ability
   to create a context and render into it without creating a throwaway
   surface, as in EGL_KHR_surfaceless_context. (Through-away surfaces are
   ok as long as they are internal to Waffle).
   
  If I understand things correctly surface(egl)/drawable(glx) are not as
  clearly
  separated in wgl. At least not initially.
  
  Redesign of Waffle's API sounds like an overkill imho, as the only thing we
  need is an easier way get from context/config data to window. Otherwise
  wcore_(context|config|window) will be dummies and everything will be stored
  in
  a wcore_display wrapper (wgl_display).
  
  Perhaps the following rough flow illustrates things a bit better
 
 
 Abstracting across many platforms is always complicated, and even more
 if we can't run tests on all of them.  So even if we end up
 redesigning, it might be better to first get windows to work (even if
 that requires a few hacks/assumptions) first, so we can run
 tests/examples.

I totally agree. Let's focus on getting Windows working with the current
API, even if it requires imperfect hacks.

  glx (in the following example window is optional)
 display  glx  create_context  window  gl*
  
  wgl (here window is the root, i.e. think of (wgl)window == (glx)display)
 window  create_context  wgl/gl
  
  Currently I shove everything in wgl_display, although a slightly cleaner
  approach might be better.

This makes sense to me.

From my uninformed perspective, it seems that shoving the Win32
window/display/device/whatever into wgl_display is the best approach.
But you and Jose likely know better than me. Whatever you need to do to
get it to work.
___
waffle mailing list
waffle@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/waffle


Re: [waffle] [PATCH 01/10] pkg/archlinux: Update to a dual (+multilib) package

2014-06-05 Thread Chad Versace
On Sat, May 31, 2014 at 03:21:59AM +0100, Emil Velikov wrote:
 Include both 64bit and multilib binaries when building
 on x86-64 platform. This saves us deeping track of version
 numbers and interdependencies in case of a split package.
 
 v2: Rebase and bump pkgrel
 
 Signed-off-by: Emil Velikov emil.l.veli...@gmail.com
 ---
  pkg/archlinux/waffle-1.3.0/PKGBUILD | 86 
 +++--
  1 file changed, 73 insertions(+), 13 deletions(-)

The x86_64 package shouldn't depend on lib32 packages. Not everyone
needs or wants to enable the multilib repo, and waffle shouldn't force
them to do that.

If you're concerned about the lib32-waffle PKGBUILD drifting out-of-sync
with the base waffle PKGBUILD, maybe you could cleverly use the bash
'source' directive and string substitution.
___
waffle mailing list
waffle@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/waffle


Re: [waffle] [PATCH 02/10] cmake: reformat/update install targets

2014-06-05 Thread Chad Versace
On Sat, May 31, 2014 at 03:22:00AM +0100, Emil Velikov wrote:
 Cleanup the formatting and add component for each build target.
 The latter will allow us to use CPack to create a component
 based installer for Windows.
 Additionally install wflinfo to CMAKE_INSTALL_BINDIR rather
 than hardcoding it to 'bin'.
 
 v2: Tag html documentation as htmldocs COMPONENT. Suggested by Chad.
 
 Signed-off-by: Emil Velikov emil.l.veli...@gmail.com

Reviewed-by: Chad Versace chad.vers...@linux.intel.com
___
waffle mailing list
waffle@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/waffle