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// Surface.h: Defines the Surface class, representing a drawing surface
16d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens// such as the client area of a window, including any back buffers.
17d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
18d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#ifndef INCLUDE_SURFACE_H_
19d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#define INCLUDE_SURFACE_H_
20d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
21d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include "Main/FrameBuffer.hpp"
22d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
23d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#define _GDI32_
24d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include <windows.h>
25d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include <GL/GL.h>
26d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#include <GL/glext.h>
27d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
28d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#if defined(_WIN32)
29d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capenstypedef HDC     NativeDisplayType;
30d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capenstypedef HBITMAP NativePixmapType;
31d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capenstypedef HWND    NativeWindowType;
32d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#else
33d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#error
34d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#endif
35d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
36d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensnamespace gl
37d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{
38d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensclass Image;
39d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensclass Display;
40d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
41d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensclass Surface
42d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens{
43d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capenspublic:
44d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	Surface(Display *display, NativeWindowType window);
45d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	Surface(Display *display, GLint width, GLint height, GLenum textureFormat, GLenum textureTarget);
46d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
47d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual ~Surface();
48d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
49d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool initialize();
50d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void swap();
51d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
52d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual Image *getRenderTarget();
53d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual Image *getDepthStencil();
54d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
55d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void setSwapInterval(GLint interval);
56d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
57d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLint getWidth() const;
58d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLint getHeight() const;
59d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLenum getTextureFormat() const;
60d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	virtual GLenum getTextureTarget() const;
61d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
62d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool checkForResize();   // Returns true if surface changed due to resize
63d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
64d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capensprivate:
65d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	void release();
66d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool reset();
67d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
68d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	Display *const mDisplay;
69d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	Image *mDepthStencil;
70d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	sw::FrameBuffer *frameBuffer;
71d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	Image *backBuffer;
72d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
73d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool reset(int backbufferWidth, int backbufferHeight);
74d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
75d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	const NativeWindowType mWindow;   // Window that the surface is created for.
76d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	bool mWindowSubclassed;           // Indicates whether we successfully subclassed mWindow for WM_RESIZE hooking
77d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLint mHeight;                    // Height of surface
78d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLint mWidth;                     // Width of surface
79d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLenum mTextureFormat;            // Format of texture: RGB, RGBA, or no texture
80d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLenum mTextureTarget;            // Type of texture: 2D or no texture
81d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens	GLint mSwapInterval;
82d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens};
83d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens}
84d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens
85d999309b36cb3dceadd38217b322f0e96a06b202Nicolas Capens#endif   // INCLUDE_SURFACE_H_
86