+1

> On Jul 28, 2016, at 3:52 PM, stepharo <steph...@free.fr> wrote:
> 
> Thanks ronie for your analysis (especially the thread local point). 
> Stef
> 
> Le 28/7/16 à 20:36, Ronie Salgado a écrit :
>> Isn't it what Ronie is working on?
>> I am not working with OpenGL or OpenGL ES anymore. I am moving all of my 
>> efforts into Woden 2, the AbstractGPU (an abstraction layer for Vulkan, 
>> Direct3D 12 and Metal), and Dastrel (Data Stream Language) a custom shader 
>> language whose compiler I implemented in Pharo, with a backend for SpirV, 
>> GLSL and C++. I still have to implement the backends for Metal and HLSL.
>> 
>> Thibault is interested more on being able to use OpenGL ES 2.0 directly in 
>> the playground, for teaching purposes without any abstraction layer 
>> underlying. I do not agree with many of his approaches, too low level, and 
>> many of themp do not work well with Pharo VM. One of the biggest issue of 
>> OpenGL is related with vsync, which is an operation that can block all of 
>> the Pharo processes, until we get a VM with the threaded FFI, which will 
>> have in the near future. It will use the UnifiedFFI API, so we will not have 
>> to further changes to take advantage of the threaded ffi in the user code.
>> 
>> A far worse problem with OpenGL is that the current OpenGL context is a 
>> thread local variable, which do not interact at all with Pharo processes. 
>> This is the reason of why I added the OSWindowRenderThread class for 
>> serializing OSWindow and OpenGL animations. SDL2 renderers are usually 
>> implemented using OpenGL. They are two correct solution for this problem:
>> - Having a VM that maps each Pharo Process into an operating system thread, 
>> - Not using OpenGL at all.
>> 
>> The others low level graphics API (Vulkan, Direct 3D and Metal) do not rely 
>> on a global thread local storage variable. These APIs are object oriented, 
>> so handles are passed in each API call.
>> 
>> Currently, I have an Athens backend above Woden 2, which is only supporting 
>> Vulkan for now. Since this backend is for Woden 2, it has some dependencies 
>> in the Woden 2 Math and the Lowcode NativeStructure. This means that the 
>> Woden 2 Athens backend has a strong dependency in the the modified 
>> OpalCompiler that uses the Lowcode extended byte code set, and the the 
>> modified PharoVM that implements these extra bytecode in the just in time 
>> compiler.
>> 
>> Anyway, implementing a Athens backend from scratch is a really hard problem, 
>> because paths can be concave, curve and self intersecting. Drawing a path, 
>> unlike drawing a triangle is a global operation, for which GPUs were not 
>> designed for. The easiest and most robust technique for drawing a path using 
>> the GPU is to flatten the path using De Casteljau's algorithm and then using 
>> the stencil buffer technique for drawing concave polygons that was described 
>> in the OpenGL red book ( 
>> http://www.glprogramming.com/red/chapter14.html#name13 ). The problem of 
>> this technique is that involves many state changes(glStencil*)  and drawing 
>> commands(glDrawElements) per path, which are the most expensive operations 
>> when using OpenGL. The alternative is to perform a triangulation in the CPU 
>> of paths, or to use one of the newer low level APIs such as Vulkan and 
>> Direct 3D 12 which were designed to reduce or eliminate the cost of state 
>> changes and drawing commands.
>> 
>> Path stroking is an even harder problem, which I have not solved yet. The 
>> standard approach is to convert a stroked path into a path that can be 
>> filled. The problem is that bezier offset curves are not bezier curves, so 
>> they have to be approximated. Fortunately, since this operation is backend 
>> agnostic, it can be used and reused by many Athens backends. Since stroking 
>> is not critical for my needs, I do not think I will implement it soon 
>> properly. Currently I am just drawing a 1 pixel thick line, which can look 
>> horrible, but is better than nothing. One algorithm that seems to be simple 
>> to implement is one described in a paper from the Cairo people, which uses 
>> the Minkowksi  Sum between the outline of the path to be stroked, and shape 
>> of the pen that is stroking
>> the path: http://keithp.com/~keithp/talks/cairo2003.pdf
>> 
>> Soon I will merge the Lowcode instructions into the SqueakVM/Cog VM to 
>> integrate these bytecodes into the mainline VM.
>> 
>> I will not publish Woden 2 until the dependencies and Woden 2 itself can be 
>> loaded easily.  Soon I will publish properly the Dastrel shader language and 
>> the Slovim backend. Slovim name comes from Smalltalk Low levelish VIrtual 
>> Machine, an intermediate representation heavily modeled after the one used 
>> in LLVM, implemented in Pharo, some very basic optimizations(basic constant 
>> folding, inlining and some dead code generation), and a code generator 
>> backend for SpirV, GLSL and C++. My biggest issue before publishing this 
>> compiler are:
>> - Implementing a command line interface.
>> - Doing an easy to install and use package for Linux, OS X and Windows.
>> - Documenting the language and the compiler.
>> 
>> Best regards,
>> Ronie
>> 
>> 2016-07-28 19:31 GMT+02:00 Alexandre Bergel <alexandre.ber...@me.com>:
>>> I would love to see an athens back-end for it.
>>> 
>> Isn't it what Ronie is working on?
>> 
>> Alexandre
>> 
>>> 
>>> Le 19/7/16 à 13:19, Thibault Raffaillac a écrit :
>>>> Hi all,
>>>> 
>>>> My tiny binding for OpenGLES2 is ready :)
>>>> 
>>>> http://smalltalkhub.com/#!/~ThibaultRaffaillac/OpenGLES2/
>>>> 
>>>> 
>>>> It takes a different direction than that of NBOpenGL. I found the support 
>>>> for all versions of OpenGL overwhelming, both for beginners and to 
>>>> maintain. With a limited number of functions I could carefully name all 
>>>> messages.
>>>> 
>>>> A demo using either SDL2 or GLFW (faster) is included, supporting VSync 
>>>> and retina displays.
>>>> Tested only on Mac OSX, patches welcome!
>>>> 
>>>> Cheers,
>>>> Thibault
>>>> 
>>>> 
>>> 
>> 
>> 
> 

-- 
_,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:
Alexandre Bergel  http://www.bergel.eu
^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;.




Reply via email to