command_buffer_gles2: Implement EGL default Display as a global object

Make EGL Display a global. eglGetDisplay(EGL_DEFAULT_DISPLAY) will
return the same object.

Store EGL state in a new thread-local object (ThreadState). One
display, multiple surfaces, multiple contexts.

Fix the currently implemented entry points to return specified errors
and behave as specified. Notable changes:
* eglGetDisplay() does not create new displays for each invocation
* eglTerminate() invalidates the created egl objects but leaves the
  current context intact as specified
* eglMakeCurrent() is implemented more correctly with refcount semantics
* eglQueryStrings() works without display for some names
* eglReleaseThread() is implemeted
* Config are now separate for pbuffers and windows, so that contexts
  can be created separate from surfaces
* Context can be made current with different surfaces
* Catches errors related to context being set current to multiple
  threads
* Tries to be thread-safe

In the implementation, the Display contains a lock ensuring all thread
accesses are consistent. All functions using or changing thread-local
state have explicit egl::ThreadState parameter.

BUG=581634
CQ_INCLUDE_TRYBOTS=tryserver.chromium.win:win_optional_gpu_tests_rel

Committed: https://crrev.com/de9aa3be41bca094454babbd62907815fad7f5c2
Cr-Commit-Position: refs/heads/master@{#377535}

Committed: https://crrev.com/7b01a0867be0895009b120f37fcd4166a84f404b
Cr-Commit-Position: refs/heads/master@{#386613}

Review URL: https://codereview.chromium.org/1714883002

Cr-Commit-Position: refs/heads/master@{#387871}
23 files changed