1d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens//
3d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Licensed under the Apache License, Version 2.0 (the "License");
4d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// you may not use this file except in compliance with the License.
5d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// You may obtain a copy of the License at
6d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens//
7d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens//    http://www.apache.org/licenses/LICENSE-2.0
8d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens//
9d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Unless required by applicable law or agreed to in writing, software
10d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// distributed under the License is distributed on an "AS IS" BASIS,
11d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// See the License for the specific language governing permissions and
13d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// limitations under the License.
14d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
15d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// Display.h: Defines the egl::Display class, representing the abstract
16d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// display on which graphics are drawn. Implements EGLDisplay.
17d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// [EGL 1.4] section 2.1.2 page 3.
18d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
19d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#ifndef INCLUDE_DISPLAY_H_
20d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#define INCLUDE_DISPLAY_H_
21d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
22d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Config.h"
23836e84fe11e2c444f99c2bf675eba40475f94941Greg Hartman#include "Common/MutexLock.hpp"
24d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Sync.hpp"
25d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
26d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include <set>
27d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
28d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensnamespace egl
29d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{
30d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	class Surface;
31d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	class Context;
32d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
33d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	const EGLDisplay PRIMARY_DISPLAY = (EGLDisplay)1;
34d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	const EGLDisplay HEADLESS_DISPLAY = (EGLDisplay)0xFACE1E55;
35d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
36d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	class Display
37d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	{
38d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	public:
39d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		static Display *get(EGLDisplay dpy);
40d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
41d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bool initialize();
42d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		void terminate();
43d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
44d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bool getConfigs(EGLConfig *configs, const EGLint *attribList, EGLint configSize, EGLint *numConfig);
45d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bool getConfigAttrib(EGLConfig config, EGLint attribute, EGLint *value);
46d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
47d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		EGLSurface createWindowSurface(EGLNativeWindowType window, EGLConfig config, const EGLint *attribList);
48d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		EGLSurface createPBufferSurface(EGLConfig config, const EGLint *attribList);
49d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		EGLContext createContext(EGLConfig configHandle, const Context *shareContext, EGLint clientVersion);
50d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		EGLSyncKHR createSync(Context *context);
51d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
52d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		void destroySurface(Surface *surface);
53d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		void destroyContext(Context *context);
54d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		void destroySync(FenceSync *sync);
55d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
56d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bool isInitialized() const;
57d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bool isValidConfig(EGLConfig config);
58d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bool isValidContext(Context *context);
59d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bool isValidSurface(Surface *surface);
60d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bool isValidWindow(EGLNativeWindowType window);
61d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bool hasExistingWindowSurface(EGLNativeWindowType window);
62d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		bool isValidSync(FenceSync *sync);
63d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
64d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		EGLint getMinSwapInterval() const;
65d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		EGLint getMaxSwapInterval() const;
66d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
67d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		void *getNativeDisplay() const;
68d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		const char *getExtensionString() const;
69d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
70d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	private:
71d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		explicit Display(void *nativeDisplay);
72d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		~Display();
73d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
74d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		sw::Format getDisplayFormat() const;
75d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
76d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		void *const nativeDisplay;
77d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
78d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		EGLint mMaxSwapInterval;
79d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		EGLint mMinSwapInterval;
80d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
81d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		typedef std::set<Surface*> SurfaceSet;
82d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SurfaceSet mSurfaceSet;
83d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
84d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		ConfigSet mConfigSet;
85d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
86d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		typedef std::set<Context*> ContextSet;
87d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		ContextSet mContextSet;
88d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
89d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		typedef std::set<FenceSync*> SyncSet;
90836e84fe11e2c444f99c2bf675eba40475f94941Greg Hartman		sw::BackoffLock mSyncSetMutex;
91d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens		SyncSet mSyncSet;
92d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	};
93d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens}
94d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
95d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#endif   // INCLUDE_DISPLAY_H_
96