blob: cac605020e74df03586f40dca9d097687291e858 [file] [log] [blame]
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef GPU_GLES2_CONFORM_SUPPORT_EGL_DISPLAY_H_
#define GPU_GLES2_CONFORM_SUPPORT_EGL_DISPLAY_H_
#include <EGL/egl.h>
#include <stddef.h>
#include <stdint.h>
#include <memory>
#include <vector>
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/synchronization/lock.h"
namespace egl {
class Config;
class Context;
class Surface;
class ThreadState;
class Display {
public:
explicit Display();
~Display();
bool is_initialized() const { return is_initialized_; }
void ReleaseCurrentForReleaseThread(ThreadState*);
// A function for windowless GTF tests.
void SetNextCreateWindowSurfaceCreatesPBuffer(EGLint width, EGLint height);
EGLBoolean Initialize(ThreadState* ts, EGLint* major, EGLint* minor);
EGLBoolean Terminate(ThreadState* ts);
const char* QueryString(ThreadState* ts, EGLint name);
// Config routines.
EGLBoolean GetConfigAttrib(ThreadState* ts,
EGLConfig cfg,
EGLint attribute,
EGLint* value);
EGLBoolean ChooseConfig(ThreadState* ts,
const EGLint* attrib_list,
EGLConfig* configs,
EGLint config_size,
EGLint* num_config);
EGLBoolean GetConfigs(ThreadState*,
EGLConfig*,
EGLint config_size,
EGLint* num_config);
// Surface routines.
static bool IsValidNativeWindow(EGLNativeWindowType);
EGLSurface CreatePbufferSurface(ThreadState*,
EGLConfig,
const EGLint* attrib_list);
EGLSurface CreateWindowSurface(ThreadState*,
EGLConfig,
EGLNativeWindowType win,
const EGLint* attrib_list);
EGLBoolean DestroySurface(ThreadState*, EGLSurface);
EGLBoolean SwapBuffers(ThreadState*, EGLSurface);
// Context routines.
EGLContext CreateContext(ThreadState*,
EGLConfig,
EGLSurface share_ctx,
const EGLint* attrib_list);
EGLBoolean DestroyContext(ThreadState*, EGLContext);
EGLBoolean ReleaseCurrent(ThreadState*);
EGLBoolean MakeCurrent(ThreadState*, EGLSurface, EGLSurface, EGLContext);
uint64_t GenerateFenceSyncRelease();
private:
void InitializeConfigsIfNeeded();
const Config* GetConfig(EGLConfig);
Surface* GetSurface(EGLSurface);
Context* GetContext(EGLContext);
EGLSurface DoCreatePbufferSurface(ThreadState* ts,
const Config* config,
EGLint width,
EGLint height);
base::Lock lock_;
bool is_initialized_;
uint64_t next_fence_sync_release_;
std::vector<scoped_refptr<Surface>> surfaces_;
std::vector<scoped_refptr<Context>> contexts_;
std::unique_ptr<Config> configs_[2];
// GTF windowless support.
bool next_create_window_surface_creates_pbuffer_;
EGLint window_surface_pbuffer_width_;
EGLint window_surface_pbuffer_height_;
DISALLOW_COPY_AND_ASSIGN(Display);
};
} // namespace egl
#endif // GPU_GLES2_CONFORM_SUPPORT_EGL_DISPLAY_H_