summaryrefslogtreecommitdiff
path: root/CompizFBO/src/fbo.h
blob: 870480c00a65c8b18e7f5cb5aff0b278153411ac (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <sys/time.h>
#include <iostream>
#include <string>
#include <fstream>
#include <X11/cursorfont.h>
#include <compiz/core/core.h>
#include <compiz/core/pluginclasshandler.h>

#include <compiz/composite/composite.h>
#include <compiz/opengl/opengl.h>
#include <compiz/mousepoll/mousepoll.h>

#include "fbo_options.h"

#define STEP_SIZE_X             4   //Number of quads in x  output->width() mod STEP_SIZE_X should be 0!!!
#define STEP_SIZE_Y             512//540 //Number of quads in y, output->height() mod STEP_SIZE_Y should be 0!!!

//typedef void ( *GLUseProgramProc) (GLuint program);
//typedef GLuint ( *GLCreateShaderProc) (GLuint type);
//typedef void ( *GLShaderSourceProc) (GLuint shader, GLsizei count, const GLchar** strings, const GLint* lengths);
//typedef void ( *GLCompileShaderProc) (GLuint shader);
//typedef void ( *GLGetShaderIvProc) (GLuint shader, GLenum pname, GLint* param);
//typedef void ( *GLGetShaderInfoLogProc) (GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog);
//typedef void ( *GLDeleteShaderProc) (GLuint shader);
//typedef void ( *GLDeleteProgramProc) (GLuint program);
//typedef GLuint ( *GLCreateProgramProc) (void);
//typedef void (*GLAttachShaderProc) (GLuint program, GLuint shader);
//typedef void (*GLLinkProgramProc) (GLuint program);
//typedef void (*GLGetProgramIvProc) (GLuint program, GLenum pname, GLint* param);
//typedef void (*GLGetProgramInfoLogProc) (GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog);
//typedef GLint (*GLGetUniformLocationProc) (GLuint program, const GLchar* name);
//typedef void (*GLUniform1iProc) (GLint location, GLint v0);
//
//extern GLUseProgramProc m_glUseProgram;
//extern GLCreateShaderProc m_glCreateShader;
//extern GLShaderSourceProc m_glShaderSource;
//extern GLCompileShaderProc m_glCompileShader;
//extern GLGetShaderIvProc m_glGetShaderiv;
//extern GLGetShaderInfoLogProc m_glGetShaderInfoLog;
//extern GLDeleteShaderProc m_glDeleteShader;
//extern GLDeleteProgramProc m_glDeleteProgram;
//extern GLCreateProgramProc m_m_glCreateProgram;
//extern GLAttachShaderProc m_glAttachShader;
//extern GLLinkProgramProc m_glLinkProgram;
//extern GLGetProgramIvProc m_glGetProgramiv;
//extern GLGetProgramInfoLogProc m_glGetProgramInfoLog;
//extern GLGetUniformLocationProc m_glGetUniformLocation;
//extern GLUniform1iProc m_glUniform1i;
extern PFNGLCREATEPROGRAMPROC      m_glCreateProgram;
extern PFNGLUSEPROGRAMPROC         m_glUseProgram;
extern PFNGLCREATESHADERPROC       m_glCreateShader;
extern PFNGLSHADERSOURCEPROC       m_glShaderSource;
extern PFNGLCOMPILESHADERPROC      m_glCompileShader;
extern PFNGLATTACHSHADERPROC       m_glAttachShader;
extern PFNGLLINKPROGRAMPROC        m_glLinkProgram;
extern PFNGLGETUNIFORMLOCATIONPROC m_glGetUniformLocation;
extern PFNGLUNIFORM1IPROC          m_glUniform1i;
extern PFNGLGETSHADERIVPROC        m_glGetShaderiv;
extern PFNGLGETSHADERINFOLOGPROC   m_glGetShaderInfoLog;
extern PFNGLGETPROGRAMINFOLOGPROC  m_glGetProgramInfoLog;
extern PFNGLGETPROGRAMIVPROC       m_glGetProgramiv;
extern PFNGLDELETESHADERPROC       m_glDeleteShader;
extern PFNGLDELETEPROGRAMPROC      m_glDeleteProgram;

#define TEXTURE_NUM 3 //color, distortion, blend

class FboScreen :
    public ScreenInterface,
    public CompositeScreenInterface,
    public GLScreenInterface,
    public PluginClassHandler<FboScreen,CompScreen>,
    public FboOptions
{
    public:

    CompositeScreen *cScreen;
	GLScreen        *gScreen;

	FboScreen (CompScreen *screen);
	~FboScreen ();

	//Screen Interface
	void handleEvent(XEvent* event);

	void paint(CompOutput::ptrList &outputs, unsigned int mask);
	void donePaint ();

	bool glPaintOutput (const GLScreenPaintAttrib &,
		       const GLMatrix &, const CompRegion &,
		       CompOutput *, unsigned int);
	void glPaintTransformedOutput (const GLScreenPaintAttrib &,
		       		  const GLMatrix &, const CompRegion &,
		       		  CompOutput *, unsigned int);

	void allocTexture (int index, char* data=NULL);
	void loadMaps();
	bool fboPrologue ();
	void fboEpilogue ();
 
	bool toggleFBO();
	bool toggleShader();
	bool queryForShader();

	void clearShader();
	GLuint loadShader(std::string& fileName, GLuint type);
	void reloadShader();
	void loadProgram(std::string& vertexShaderPath, std::string& fragmentShaderPath);
	void bindShader();
	void unbindShader();

	bool
	toggleShader (CompAction *action,
			 CompAction::State  state,
			 CompOption::Vector &options);

    //Cursor related code, partly taken from ezoom plugin
	public:
    	class Cursor
    	{
    	    private:
			bool set;
    		GLuint     texture;
    		CompScreen *screen;
    		int        mXHot;
    		int        mYHot;
    		int        mWidth;
    		int        mHeight;
    		CompPoint pos;
			

    	    public:
				Cursor ();
				void
				setPos(int x, int y);
				void
				updateTextureData(unsigned char* data, int width, int height, int x, int y, int xHot, int yHot, CompScreen* screen);
				void
				draw();
				void
				free();
    	};
    void
    cursorActivate();
    void
    cursorDeactivate();
	void
	cursorHide();
	void
	cursorShow();
    void
    updateCursor (Cursor * cursor);
    void
    updateMouseInterval (const CompPoint &p);
    void
    optionChanged (CompOption	       *option,
    			       FboOptions::Options num);

private:
	CompScreen::GrabHandle grabIndex;

	int width, height;

	GLuint program;
	GLuint texture[TEXTURE_NUM];

	int     tIndex;
	unsigned int mCurrentTextureIndex;
	GLenum  target;
	GLfloat tx, ty;

	int count;

	GLuint fbo;
	GLint  fboStatus;
	GLuint shaderProgram;
	GLuint vertexShader;
	GLuint fragmentShader;

	bool toggle, mToggleShader;
	bool shaderInitialized;
	float rotate;
	int counter;
    int distWidth, distHeight;

	MousePoller		 pollHandle;

	bool fixesSupported;
	int fixesEventBase;
	int fixesErrorBase;
	bool canHideCursor;
	bool cursorInfoSelected;
	Cursor cursor;
};

class FboPluginVTable :
    public CompPlugin::VTableForScreen<FboScreen>
{
    public:

	bool init ();
};