For anyone who wants to build a windows .exe with go-sdl2 and opengl, and 
has an optimus driver, and wants to ensure that 
the high performance gpu is selected by default for their final product, I 
will document my findings here....

I found the followingsolution, which can be proven that it works by having 
this line in the go-sdl2 code:

var vendorString string = gl.GoStringUb(gl.GetString(gl.VENDOR))
fmt.Printf("Vendor String is %v \n", vendorString)


which outputs:
Vendor String is NVIDIA Corporation
instead of
Vendor String is Intel

Also process explorer shows that the gpu memory usage is only on the 
dedicated memory usage, 
and also the opengl performance is much higher.

The first thing to do is to have an export on the created object file. 
I did this by putting this in my main .go file

//__declspec(dllexport) unsigned long NvOptimusEnablement = 0x00000001;
import "C"


The corresponding object file now has this symbol but the linker removes 
it, since it is building an .exe on windows,
and I guess GNU GCC tool chain by default removes all symbols (I did not 
try to switch the toolchain to Microsoft link.exe at this point)

Then to have this symbols (and unfortunately all other symbols) get 
exported in the final .exe I added this to the build options:

go install -ldflags "-v -extldflags -Wl,--export-all-symbols" 
pkgdnm/opengl3perftest


now dumpbin /export shows a huge number of exported symbols on the .exe and 
NvOptimusEnablement is one of them
This works, and optimus driver automatically selects the dedicated GPU when 
the executable is run, 
but the down side is there are many more exported symbols.
There is another option which is 

--dynamic-list=dynamic_symbol_table.txt


I put the contents of dynamic_symbol_table as just this

{
  extern "C"
  {
    "NvOptimusEnablement";
  };
};


but this did not work, meaning nothing was exported. The GNU GCC 
documentation is somewhat unclear 
(https://sourceware.org/binutils/docs/ld/Options.html)
"This option is only meaningful on ELF platforms "

I could not find any option on gcc ld doc in section: " Options Specific to 
i386 PE Targets" to limit the exported symbols to only what needed, but as 
far as automatically selecting the dedicated GPU goal, goes, this works.

If anyone know a better/simpler way to export a symbol from .go file to the 
object file to be linked
or maybe know how to limit the exported symbols in the final executable 
using gnu ld PE target options
please comment.

First in my main package I have these lines
On Monday, January 23, 2017 at 7:13:30 PM UTC+3, Hakan Guleryuz wrote:
>
> In normal C/C++ SDL2 related app I write, adding the following code
>
> extern "C" {
>    _declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
> }
>
> causes the driver system with integrated and dedicated nvidia gpu, to auto 
> select the dedicated nvidia gpu. 
>
> See here for some explanation of the mechanism->
> https://github.com/urho3d/Urho3D/issues/139
>
> http://stackoverflow.com/questions/16823372/forcing-machine-to-use-dedicated-graphics-card
>
>
>
> <http://stackoverflow.com/questions/16823372/forcing-machine-to-use-dedicated-graphics-card>
>
> I can view the exports of the final executable with "dumpbin /exports 
> <executable name>"
>
> [dumpbin is a tool installed with visual studio C++ tools]
>
>
> How can I make my go executable export this value symbol?
>
> I searched go link documentation but could not find something useful to 
> achieve this.
>
> I did some tests with cgo and "//export" command with a simple var, but 
> that did not have any effect on "dumpbin /exports" output (no symbols 
> exported)
>
>
> I can see which GPU the executable is using by inspecting it with "process 
> explorer" and its "dedicated GPU memory usage"
>
>
> The go build "go-sdl2" app, by default, uses the CPU's embedded low 
> performance integrated GPU, since I can not export this value with the 
> executable.
>
>
> Thanks for any help.
>
>
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to