Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
Ludmány Balázs
/
thin-client
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
A prog2-höz tartozó friss repo anyagok itt elérhetőek:
https://git.iit.bme.hu/
Commit
14d916c7
authored
Jul 14, 2016
by
Ludmány Balázs
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
First working version
parent
67e94d7e
Pipeline
#130
skipped in 0 seconds
Changes
12
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
197 additions
and
143 deletions
+197
-143
ThinClient.pro
+1
-1
ThinClient.pro.user
+1
-1
dispatcher.cpp
+1
-0
draw_shader.fsh
+3
-2
draw_shader.vsh
+6
-2
main.cpp
+3
-0
main.qml
+5
-1
qvnc.cpp
+3
-4
uploader.cpp
+115
-49
uploader.h
+8
-7
vncrenderer.cpp
+43
-65
vncrenderer.h
+8
-11
No files found.
ThinClient.pro
View file @
14d916c7
...
...
@@ -19,7 +19,7 @@ QML_IMPORT_PATH =
include
(
deployment
.
pri
)
unix
|
win32
:
LIBS
+=
-
L
$$
PWD
/../
libvnc
/
libvncclient
/.
libs
/
-
lvncclient
unix
|
win32
:
LIBS
+=
-
L
$$
PWD
/../
libvnc
/
libvncclient
/.
libs
/
-
lvncclient
-
lEGL
INCLUDEPATH
+=
$$
PWD
/../
libvnc
DEPENDPATH
+=
$$
PWD
/../
libvnc
...
...
ThinClient.pro.user
View file @
14d916c7
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
<!-- Written by QtCreator 3.5.1, 2016-07-
08T15:41:5
8. -->
<!-- Written by QtCreator 3.5.1, 2016-07-
11T16:48:0
8. -->
<qtcreator>
<data>
<variable>
EnvironmentId
</variable>
...
...
dispatcher.cpp
View file @
14d916c7
...
...
@@ -172,6 +172,7 @@ void Dispatcher::open(QString host, int port)
m_client
->
GotBitmap
=
Dispatcher
::
GotBitmap
;
m_client
->
GotJpeg
=
Dispatcher
::
GotJpeg
;
m_client
->
FinishedFrameBufferUpdate
=
Dispatcher
::
FinishedFrameBufferUpdate
;
m_client
->
appData
.
useRemoteCursor
=
TRUE
;
rfbClientSetClientData
(
m_client
,
0
,
this
);
...
...
draw_shader.fsh
View file @
14d916c7
uniform sampler2D texture;
varying highp vec2 vartexcoord;
varying lowp vec2 vartexcoord;
varying lowp vec3 varcolor;
void main(void)
{
gl_FragColor = vec4(texture2D(texture, vartexcoord).rgb, 1.0);
gl_FragColor = vec4(texture2D(texture, vartexcoord).rgb
+ varcolor
, 1.0);
}
draw_shader.vsh
View file @
14d916c7
uniform highp mat4 ortho;
uniform lowp vec3 colormax;
attribute highp vec2 position;
attribute highp vec2 texcoord;
varying highp vec2 vartexcoord;
attribute lowp vec3 color;
attribute lowp vec2 texcoord;
varying lowp vec3 varcolor;
varying lowp vec2 vartexcoord;
void main(void)
{
gl_Position = ortho * vec4(position, 0.0, 1.0);
varcolor = color / colormax;
vartexcoord = texcoord;
}
main.cpp
View file @
14d916c7
#define QT_OPENGL_ES_2 1
#include <QGuiApplication>
#include <QtQml>
#include <QQmlApplicationEngine>
...
...
@@ -6,6 +8,7 @@
int
main
(
int
argc
,
char
*
argv
[])
{
QGuiApplication
::
setAttribute
(
Qt
::
AA_UseOpenGLES
,
true
);
QGuiApplication
app
(
argc
,
argv
);
qmlRegisterType
<
QVnc
>
(
"thinclient"
,
1
,
3
,
"QVnc"
);
...
...
main.qml
View file @
14d916c7
...
...
@@ -30,9 +30,13 @@ ApplicationWindow {
width
:
1024
height
:
768
/* Keys {
onPressed:
}*/
MouseArea
{
anchors.fill
:
parent
cursorShape
:
Qt
.
BlankCursor
//
cursorShape: Qt.BlankCursor
hoverEnabled
:
true
acceptedButtons
:
Qt
.
LeftButton
|
Qt
.
MiddleButton
|
Qt
.
RightButton
onPositionChanged
:
vnc
.
setMouse
(
mouse
.
x
,
...
...
qvnc.cpp
View file @
14d916c7
...
...
@@ -18,7 +18,8 @@ QVnc::QVnc()
connect
(
m_dispatcher
,
&
Dispatcher
::
updateFramebuffer
,
this
,
&
QVnc
::
update
);
connect
(
m_dispatcher
,
&
Dispatcher
::
error
,
this
,
&
QVnc
::
dispatch_error
);
QThreadPool
::
globalInstance
()
->
reserveThread
();
// QThreadPool::globalInstance()->reserveThread();
qDebug
()
<<
QThreadPool
::
globalInstance
()
->
maxThreadCount
();
m_dispatcher_thread
.
start
();
}
...
...
@@ -80,10 +81,8 @@ Dispatcher *QVnc::dispatcher() const
QQuickFramebufferObject
::
Renderer
*
QVnc
::
createRenderer
()
const
{
VncRenderer
*
renderer
=
new
VncRenderer
(
window
(),
m_dispatcher
->
uploader
().
fill_buffer
(),
m_dispatcher
->
uploader
().
vertices
(),
m_dispatcher
->
uploader
().
copy_textures
(),
m_dispatcher
->
uploader
().
copy_buffer
(),
m_dispatcher
->
uploader
().
draw_buffer
(),
m_dispatcher
->
uploader
().
draw_textures
());
connect
(
renderer
,
&
VncRenderer
::
finishedRendering
,
m_dispatcher
,
&
Dispatcher
::
refresh
);
connect
(
renderer
,
&
VncRenderer
::
FBOTextureChanged
,
&
(
m_dispatcher
->
uploader
()),
&
Uploader
::
changeFBOTexture
);
...
...
uploader.cpp
View file @
14d916c7
#include "uploader.h"
#include <cstring>
Uploader
::
Uploader
(
QObject
*
parent
)
:
QObject
(
parent
),
m_uploader_context
(
this
),
m_copyProgram
(
this
)
{
...
...
@@ -14,6 +15,7 @@ Uploader::Uploader(QObject *parent) : QObject(parent), m_uploader_context(this),
m_copy_data
.
reserve
(
5
);
m_copy_textures
->
reserve
(
5
);
m_draw_textures
->
reserve
(
5
);
m_vertices
=
QSharedPointer
<
QOpenGLBuffer
>
(
new
QOpenGLBuffer
);
}
Uploader
::~
Uploader
()
...
...
@@ -27,7 +29,7 @@ void Uploader::create_context(QOpenGLContext *context)
-
1.0
f
,
1.0
f
,
1.0
f
,
-
1.0
f
,
1.0
f
,
1.0
f
};
m_uploader_context
.
setShareContext
(
context
);
m_uploader_context
.
create
();
m_uploader_context
.
makeCurrent
(
&
m_surface
);
...
...
@@ -36,14 +38,14 @@ void Uploader::create_context(QOpenGLContext *context)
m_copyProgram
.
addShaderFromSourceFile
(
QOpenGLShader
::
Vertex
,
"copy_shader.vsh"
);
m_copyProgram
.
addShaderFromSourceFile
(
QOpenGLShader
::
Fragment
,
"copy_shader.fsh"
);
m_copyProgram
.
bind
();
m_copyProgram
.
setUniformValue
(
"texture"
,
GL_TEXTURE_2D
);
m_functions
->
glActiveTexture
(
GL_TEXTURE0
);
m_copyProgram
.
setUniformValue
(
"texture"
,
0
);
m_copyProgram
.
enableAttributeArray
(
"position"
);
m_copyProgram
.
enableAttributeArray
(
"texcoord"
);
m_copyProgram
.
setAttributeArray
(
"position"
,
GL_FLOAT
,
position
,
2
);
m_fill_buffer
.
create
();
m_copy_buffer
.
create
();
m_draw_buffer
.
create
();
m_vertices
->
create
();
m_vertices
->
setUsagePattern
(
QOpenGLBuffer
::
DynamicDraw
);
}
void
Uploader
::
startedUpdate
()
...
...
@@ -64,6 +66,7 @@ void Uploader::startedUpdate()
m_draw_textures
->
clear
();
m_draw_data
.
clear
();
m_draw_count
=
0
;
}
void
Uploader
::
gotCopyRect
(
const
int
src_x
,
const
int
src_y
,
const
int
width
,
const
int
height
,
const
int
dest_x
,
const
int
dest_y
)
...
...
@@ -75,31 +78,55 @@ void Uploader::gotCopyRect(const int src_x, const int src_y, const int width, co
QOpenGLFramebufferObject
fbo
(
width
,
height
);
fbo
.
bind
();
m_functions
->
glBindTexture
(
GL_TEXTURE_2D
,
m_FBOTexture
);
m_functions
->
glViewport
(
0
,
0
,
width
,
height
);
m_copyProgram
.
setAttributeArray
(
"texcoord"
,
GL_FLOAT
,
texcoord
,
2
);
m_functions
->
glBindTexture
(
GL_TEXTURE_2D
,
m_FBOTexture
);
m_functions
->
glTexParameteri
(
GL_TEXTURE_2D
,
GL_TEXTURE_MIN_FILTER
,
GL_NEAREST
);
m_functions
->
glTexParameteri
(
GL_TEXTURE_2D
,
GL_TEXTURE_MAG_FILTER
,
GL_NEAREST
);
m_functions
->
glTexParameteri
(
GL_TEXTURE_2D
,
GL_TEXTURE_WRAP_S
,
GL_CLAMP_TO_EDGE
);
m_functions
->
glTexParameteri
(
GL_TEXTURE_2D
,
GL_TEXTURE_WRAP_T
,
GL_CLAMP_TO_EDGE
);
m_functions
->
glDrawArrays
(
GL_TRIANGLE_STRIP
,
0
,
4
);
m_copy_textures
->
append
(
fbo
.
takeTexture
());
m_functions
->
glBindTexture
(
GL_TEXTURE_2D
,
0
);
// bottom left
m_copy_data
.
append
((
float
)
dest_x
);
m_copy_data
.
append
((
float
)
(
dest_y
+
height
));
m_copy_data
.
append
(
0.0
f
);
m_copy_data
.
append
(
0.0
f
);
m_copy_data
.
append
(
0.0
f
);
m_copy_data
.
append
(
0.0
f
);
m_copy_data
.
append
(
0.0
f
);
// top left
m_copy_data
.
append
((
float
)
dest_x
);
m_copy_data
.
append
((
float
)
dest_y
);
m_copy_data
.
append
(
0.0
f
);
m_copy_data
.
append
(
0.0
f
);
m_copy_data
.
append
(
0.0
f
);
m_copy_data
.
append
(
0.0
f
);
m_copy_data
.
append
(
1.0
f
);
// bottom right
m_copy_data
.
append
((
float
)
(
dest_x
+
width
));
m_copy_data
.
append
((
float
)
(
dest_y
+
height
));
m_copy_data
.
append
(
0.0
f
);
m_copy_data
.
append
(
0.0
f
);
m_copy_data
.
append
(
0.0
f
);
m_copy_data
.
append
(
1.0
f
);
m_copy_data
.
append
(
0.0
f
);
// top right
m_copy_data
.
append
((
float
)
(
dest_x
+
width
));
m_copy_data
.
append
((
float
)
dest_y
);
m_copy_data
.
append
(
0.0
f
);
m_copy_data
.
append
(
0.0
f
);
m_copy_data
.
append
(
0.0
f
);
m_copy_data
.
append
(
1.0
f
);
m_copy_data
.
append
(
1.0
f
);
...
...
@@ -121,83 +148,132 @@ void Uploader::gotFillRect(const int x, const int y, const int width, const int
m_fill_data
.
append
(
red
);
m_fill_data
.
append
(
green
);
m_fill_data
.
append
(
blue
);
m_fill_data
.
append
(
0.0
f
);
m_fill_data
.
append
(
0.0
f
);
// top left
m_fill_data
.
append
((
float
)
x
);
m_fill_data
.
append
((
float
)
y
);
m_fill_data
.
append
(
red
);
m_fill_data
.
append
(
green
);
m_fill_data
.
append
(
blue
);
m_fill_data
.
append
(
0.0
f
);
m_fill_data
.
append
(
0.0
f
);
// bottom right
m_fill_data
.
append
((
float
)
(
x
+
width
));
m_fill_data
.
append
((
float
)
(
y
+
height
));
m_fill_data
.
append
(
red
);
m_fill_data
.
append
(
green
);
m_fill_data
.
append
(
blue
);
m_fill_data
.
append
(
0.0
f
);
m_fill_data
.
append
(
0.0
f
);
// top right
m_fill_data
.
append
((
float
)
(
x
+
width
));
m_fill_data
.
append
((
float
)
y
);
m_fill_data
.
append
(
red
);
m_fill_data
.
append
(
green
);
m_fill_data
.
append
(
blue
);
m_fill_data
.
append
(
0.0
f
);
m_fill_data
.
append
(
0.0
f
);
m_fill_count
++
;
}
void
Uploader
::
gotBitmap
(
const
QImage
&
image
,
const
int
x
,
const
int
y
,
const
int
width
,
const
int
height
)
void
Uploader
::
gotBitmap
(
const
QImage
&
image
,
const
quint32
x
,
const
quint32
y
,
const
quint32
width
,
const
quint32
height
)
{
// TODO: use power of 2 textures
QImage
img
=
image
.
convertToFormat
(
QImage
::
Format_RGBA8888
);
// "This function returns the nearest power of two greater than value."
// We need greater than or equal
quint32
real_width
=
qNextPowerOfTwo
(
width
-
1
);
quint32
real_height
=
qNextPowerOfTwo
(
height
-
1
);
float
bottom
=
(
float
)
height
/
(
float
)
real_height
;
float
right
=
(
float
)
width
/
(
float
)
real_width
;
m_functions
->
glPixelStorei
(
GL_UNPACK_ALIGNMENT
,
1
);
QOpenGLTexture
*
tex
=
new
QOpenGLTexture
(
QOpenGLTexture
::
Target2D
);
tex
->
setSize
(
real_width
,
real_height
);
tex
->
setMipLevels
(
1
);
tex
->
setFormat
(
QOpenGLTexture
::
RGBAFormat
);
tex
->
setMinMagFilters
(
QOpenGLTexture
::
Nearest
,
QOpenGLTexture
::
Nearest
);
tex
->
setWrapMode
(
QOpenGLTexture
::
ClampToEdge
);
tex
->
allocateStorage
(
QOpenGLTexture
::
RGBA
,
QOpenGLTexture
::
UInt8
);
tex
->
bind
();
m_functions
->
glTexSubImage2D
(
GL_TEXTURE_2D
,
0
,
0
,
0
,
width
,
height
,
GL_RGBA
,
GL_UNSIGNED_BYTE
,
img
.
constBits
());
tex
->
release
();
// TODO: use a single texture
m_draw_textures
->
append
(
new
QOpenGLTexture
(
image
.
mirrored
(),
QOpenGLTexture
::
DontGenerateMipMaps
)
);
m_draw_textures
->
append
(
tex
);
// bottom left
m_draw_data
.
append
((
float
)
x
);
m_draw_data
.
append
((
float
)
(
y
+
height
));
m_draw_data
.
append
(
0.0
f
);
m_draw_data
.
append
(
0.0
f
);
m_draw_data
.
append
(
0.0
f
);
m_draw_data
.
append
(
0.0
f
);
m_draw_data
.
append
(
bottom
);
// top left
m_draw_data
.
append
((
float
)
x
);
m_draw_data
.
append
((
float
)
y
);
m_draw_data
.
append
(
0.0
f
);
m_draw_data
.
append
(
0.0
f
);
m_draw_data
.
append
(
0.0
f
);
m_draw_data
.
append
(
0.0
f
);
m_draw_data
.
append
(
0.0
f
);
m_draw_data
.
append
(
1.0
f
);
// bottom right
m_draw_data
.
append
((
float
)
(
x
+
width
));
m_draw_data
.
append
((
float
)
(
y
+
height
));
m_draw_data
.
append
(
1.0
f
);
m_draw_data
.
append
(
0.0
f
);
m_draw_data
.
append
(
0.0
f
);
m_draw_data
.
append
(
0.0
f
);
m_draw_data
.
append
(
right
);
m_draw_data
.
append
(
bottom
);
// top right
m_draw_data
.
append
((
float
)
(
x
+
width
));
m_draw_data
.
append
((
float
)
y
);
m_draw_data
.
append
(
1.0
f
);
m_draw_data
.
append
(
1.0
f
);
m_draw_data
.
append
(
0.0
f
);
m_draw_data
.
append
(
0.0
f
);
m_draw_data
.
append
(
0.0
f
);
m_draw_data
.
append
(
right
);
m_draw_data
.
append
(
0.0
f
);
m_draw_count
++
;
}
void
Uploader
::
finishedUpdate
()
{
// TODO: calculate texture atlas and upload
// TODO: use a single buffer
// TODO: reuse buffer, don't reallocate
if
(
m_fill_count
>
0
)
{
m_fill_buffer
.
bind
();
m_fill_buffer
.
allocate
(
m_fill_data
.
constData
(),
m_fill_data
.
size
()
*
sizeof
(
float
));
m_fill_buffer
.
release
();
}
if
(
m_copy_count
>
0
)
{
m_copy_buffer
.
bind
();
m_copy_buffer
.
allocate
(
m_copy_data
.
constData
(),
m_copy_data
.
size
()
*
sizeof
(
float
));
m_copy_buffer
.
release
();
}
if
(
m_draw_count
>
0
)
{
m_draw_buffer
.
bind
();
m_draw_buffer
.
allocate
(
m_draw_data
.
data
(),
m_draw_data
.
size
()
*
sizeof
(
float
));
m_draw_buffer
.
release
();
unsigned
int
fillSize
=
m_fill_data
.
size
()
*
sizeof
(
float
);
unsigned
int
copySize
=
m_copy_data
.
size
()
*
sizeof
(
float
);
unsigned
int
drawSize
=
m_draw_data
.
size
()
*
sizeof
(
float
);
unsigned
int
sumSize
=
fillSize
+
copySize
+
drawSize
;
m_vertices
->
bind
();
if
(
sumSize
>
m_allocated
)
{
m_vertices
->
allocate
(
sumSize
);
m_allocated
=
sumSize
;
}
m_functions
->
glFlush
();
if
(
fillSize
>
0
)
m_vertices
->
write
(
0
,
m_fill_data
.
constData
(),
fillSize
);
if
(
copySize
>
0
)
m_vertices
->
write
(
fillSize
,
m_copy_data
.
constData
(),
copySize
);
if
(
drawSize
>
0
)
m_vertices
->
write
(
fillSize
+
copySize
,
m_draw_data
.
constData
(),
drawSize
);
m_functions
->
glGetError
();
m_vertices
->
release
();
m_functions
->
glFinish
();
}
unsigned
int
Uploader
::
fill_count
()
const
...
...
@@ -215,29 +291,19 @@ unsigned int Uploader::draw_count() const
return
m_draw_count
;
}
QOpenGLBuffer
Uploader
::
fill_buffer
()
{
return
m_fill_buffer
;
}
QSharedPointer
<
QVector
<
GLuint
>>
Uploader
::
copy_textures
()
{
return
m_copy_textures
;
}
QOpenGLBuffer
Uploader
::
copy_buffer
()
{
return
m_copy_buffer
;
}
QOpenGLBuffer
Uploader
::
draw_buffer
()
QSharedPointer
<
QVector
<
QOpenGLTexture
*>>
Uploader
::
draw_textures
()
{
return
m_draw_
buffer
;
return
m_draw_
textures
;
}
QSharedPointer
<
Q
Vector
<
QOpenGLTexture
*>>
Uploader
::
draw_textures
()
QSharedPointer
<
Q
OpenGLBuffer
>
Uploader
::
vertices
()
const
{
return
m_draw_textur
es
;
return
m_vertic
es
;
}
void
Uploader
::
changeFBOTexture
(
const
unsigned
int
FBOTexture
,
const
QMatrix4x4
&
ortho
)
...
...
uploader.h
View file @
14d916c7
...
...
@@ -10,11 +10,14 @@
#include <QOpenGLFunctions>
#include <QOpenGLBuffer>
#include <QOpenGLTexture>
#include <QOpenGLPixelTransferOptions>
#include <QOpenGLShaderProgram>
#include <QOpenGLFramebufferObject>
#include <QThreadPool>
#include <QtAlgorithms>
#include <QSharedPointer>
#include <QtMath>
// #include <GLES/gl2ext.h>
class
Uploader
:
public
QObject
{
...
...
@@ -26,7 +29,7 @@ public:
void
startedUpdate
();
void
gotCopyRect
(
const
int
src_x
,
const
int
src_y
,
const
int
width
,
const
int
height
,
const
int
dest_x
,
const
int
dest_y
);
void
gotFillRect
(
const
int
x
,
const
int
y
,
const
int
width
,
const
int
height
,
const
float
red
,
const
float
green
,
const
float
blue
);
void
gotBitmap
(
const
QImage
&
image
,
const
int
x
,
const
int
y
,
const
int
width
,
const
int
height
);
void
gotBitmap
(
const
QImage
&
image
,
const
quint32
x
,
const
quint32
y
,
const
quint32
width
,
const
quint32
height
);
void
finishedUpdate
();
void
setFramebufferHeight
(
int
framebufferHeight
);
...
...
@@ -35,34 +38,32 @@ public:
unsigned
int
copy_count
()
const
;
unsigned
int
draw_count
()
const
;
QOpenGLBuffer
fill_buffer
();
QSharedPointer
<
QVector
<
GLuint
>>
copy_textures
();
QOpenGLBuffer
copy_buffer
();
QOpenGLBuffer
draw_buffer
();
QSharedPointer
<
QVector
<
QOpenGLTexture
*>>
draw_textures
();
QSharedPointer
<
QOpenGLBuffer
>
vertices
()
const
;
private
:
int
m_framebufferHeight
;
QOffscreenSurface
m_surface
;
QOpenGLContext
m_uploader_context
;
QOpenGLFunctions
*
m_functions
;
QSharedPointer
<
QOpenGLBuffer
>
m_vertices
;
unsigned
int
m_allocated
;
QOpenGLShaderProgram
m_copyProgram
;
GLuint
m_FBOTexture
;
unsigned
int
m_fill_count
;
QVector
<
float
>
m_fill_data
;
QOpenGLBuffer
m_fill_buffer
;
unsigned
int
m_copy_count
;
QVector
<
float
>
m_copy_data
;
QSharedPointer
<
QVector
<
GLuint
>>
m_copy_textures
;
QOpenGLBuffer
m_copy_buffer
;
unsigned
int
m_draw_count
;
QVector
<
float
>
m_draw_data
;
QOpenGLBuffer
m_draw_buffer
;
QSharedPointer
<
QVector
<
QOpenGLTexture
*>>
m_draw_textures
;
uchar
m_decoders_running
;
...
...
vncrenderer.cpp
View file @
14d916c7
#include "vncrenderer.h"
#include <cstring>
VncRenderer
::
VncRenderer
(
QQuickWindow
*
window
,
Q
OpenGLBuffer
fill_buffer
,
Q
SharedPointer
<
QOpenGLBuffer
>
vertices
,
QSharedPointer
<
QVector
<
GLuint
>>
copy_textures
,
QOpenGLBuffer
copy_buffer
,
QOpenGLBuffer
draw_buffer
,
QSharedPointer
<
QVector
<
QOpenGLTexture
*>>
draw_textures
,
QObject
*
parent
)
:
QObject
(
parent
),
m_window
(
window
),
m_clear
(
true
),
m_fill_buffer
(
fill_buffer
),
m_copy_textures
(
copy_textures
),
m_copy_buffer
(
copy_buffer
),
m_draw_buffer
(
draw_buffer
),
m_draw_textures
(
draw_textures
)
QObject
(
parent
),
m_clear
(
true
),
m_window
(
window
),
m_vertices
(
vertices
),
m_copy_textures
(
copy_textures
),
m_draw_textures
(
draw_textures
)
{
m_fill_program
.
addShaderFromSourceFile
(
QOpenGLShader
::
Vertex
,
"fill_shader.vsh"
);
m_fill_program
.
addShaderFromSourceFile
(
QOpenGLShader
::
Fragment
,
"fill_shader.fsh"
);
m_fill_program
.
link
();
m_draw_program
.
addShaderFromSourceFile
(
QOpenGLShader
::
Vertex
,
"draw_shader.vsh"
);
m_draw_program
.
addShaderFromSourceFile
(
QOpenGLShader
::
Fragment
,
"draw_shader.fsh"
);
m_draw_program
.
bind
();
m_draw_program
.
setUniformValue
(
"texture"
,
GL_TEXTURE_2D
);
m_draw_program
.
release
();
m_program
.
addShaderFromSourceFile
(
QOpenGLShader
::
Vertex
,
"draw_shader.vsh"
);
m_program
.
addShaderFromSourceFile
(
QOpenGLShader
::
Fragment
,
"draw_shader.fsh"
);
m_program
.
bind
();
m_program
.
setUniformValue
(
"texture"
,
0
);
m_program
.
release
();
m_functions
=
QOpenGLContext
::
currentContext
()
->
functions
();
m_functions
->
glActiveTexture
(
GL_TEXTURE0
);
}
void
VncRenderer
::
render
()
{
/*if(m_frameCount == 0)
m_time.start();
else
qDebug() << (float(m_frameCount) / (float(m_time.elapsed()) / 1000.0f));
m_frameCount++;*/
if
(
m_clear
)
{
m_functions
->
glClearColor
(
0.0
f
,
0.0
f
,
0.0
f
,
1.0
f
);
m_functions
->
glClear
(
GL_COLOR_BUFFER_BIT
);
m_clear
=
false
;
}
if
(
m_fill_count
>
0
)
{
m_fill_program
.
bind
();
m_fill_program
.
enableAttributeArray
(
"position"
);
m_fill_program
.
enableAttributeArray
(
"color"
);
m_fill_buffer
.
bind
();
m_fill_program
.
setAttributeBuffer
(
"position"
,
GL_FLOAT
,
0
*
sizeof
(
float
),
2
,
5
*
sizeof
(
float
));
m_fill_program
.
setAttributeBuffer
(
"color"
,
GL_FLOAT
,
2
*
sizeof
(
float
),
3
,
5
*
sizeof
(
float
));
for
(
unsigned
int
i
=
0
;
i
<
m_fill_count
;
i
++
)
m_functions
->
glDrawArrays
(
GL_TRIANGLE_STRIP
,
i
*
4
,
4
);
m_fill_buffer
.
release
();
m_fill_program
.
release
();
m_program
.
bind
();
m_vertices
->
bind
();
m_program
.
setAttributeBuffer
(
"position"
,
GL_FLOAT
,
0
*
sizeof
(
float
),
2
,
7
*
sizeof
(
float
));
m_program
.
setAttributeBuffer
(
"color"
,
GL_FLOAT
,
2
*
sizeof
(
float
),
3
,
7
*
sizeof
(
float
));
m_program
.
setAttributeBuffer
(
"texcoord"
,
GL_FLOAT
,
5
*
sizeof
(
float
),
2
,
7
*
sizeof
(
float
));
m_program
.
enableAttributeArray
(
"position"
);
m_program
.
enableAttributeArray
(
"color"
);
m_program
.
enableAttributeArray
(
"texcoord"
);
for
(
unsigned
int
i
=
0
;
i
<
m_fill_count
;
i
++
)
m_functions
->
glDrawArrays
(
GL_TRIANGLE_STRIP
,
i
*
4
,
4
);
for
(
unsigned
int
i
=
0
;
i
<
m_copy_count
;
i
++
)
{
m_functions
->
glBindTexture
(
GL_TEXTURE_2D
,
m_copy_textures
->
at
(
i
));
m_functions
->
glDrawArrays
(
GL_TRIANGLE_STRIP
,
(
m_fill_count
+
i
)
*
4
,
4
);
}
if
(
m_copy_count
>
0
||
m_draw_count
>
0
)
m_draw_program
.
bind
();
m_draw_program
.
enableAttributeArray
(
"position"
);
m_draw_program
.
enableAttributeArray
(
"texcoord"
);
if
(
m_copy_count
>
0
){
m_copy_buffer
.
bind
();
m_draw_program
.
setAttributeBuffer
(
"position"
,
GL_FLOAT
,
0
*
sizeof
(
float
),
2
,
4
*
sizeof
(
float
));
m_draw_program
.
setAttributeBuffer
(
"texcoord"
,
GL_FLOAT
,
2
*
sizeof
(
float
),
2
,
4
*
sizeof
(
float
));
for
(
unsigned
int
i
=
0
;
i
<
m_copy_count
;
i
++
)
{
m_functions
->
glBindTexture
(
GL_TEXTURE_2D
,
m_copy_textures
->
at
(
i
));
m_functions
->
glDrawArrays
(
GL_TRIANGLE_STRIP
,
i
*
4
,
4
);
}
m_functions
->
glBindTexture
(
GL_TEXTURE_2D
,
0
);
m_copy_buffer
.
release
();
}
if
(
m_draw_count
>
0
)
{
m_draw_buffer
.
bind
();
m_draw_program
.
setAttributeBuffer
(
"position"
,
GL_FLOAT
,
0
*
sizeof
(
float
),
2
,
4
*
sizeof
(
float
));
m_draw_program
.
setAttributeBuffer
(
"texcoord"
,
GL_FLOAT
,
2
*
sizeof
(
float
),
2
,
4
*
sizeof
(
float
));
for
(
unsigned
int
i
=
0
;
i
<
m_draw_count
;
i
++
)
{
m_draw_textures
->
at
(
i
)
->
bind
();
m_functions
->
glDrawArrays
(
GL_TRIANGLE_STRIP
,
i
*
4
,
4
);
m_draw_textures
->
at
(
i
)
->
release
();
}
m_draw_buffer
.
release
();
for
(
unsigned
int
i
=
0
;
i
<
m_draw_count
;
i
++
)
{
m_draw_textures
->
at
(
i
)
->
bind
();
m_functions
->
glDrawArrays
(
GL_TRIANGLE_STRIP
,
(
m_fill_count
+
m_copy_count
+
i
)
*
4
,
4
);
m_draw_textures
->
at
(
i
)
->
release
();
}
if
(
m_copy_count
>
0
||
m_draw_count
>
0
)
m_draw
_program
.
release
();
m_vertices
->
release
();
m
_program
.
release
();
m_functions
->
glFlush
();
m_window
->
resetOpenGLState
();
emit
finishedRendering
();
...
...
@@ -88,11 +68,9 @@ QOpenGLFramebufferObject *VncRenderer::createFramebufferObject(const QSize &size
{
QMatrix4x4
ortho
;
ortho
.
ortho
(
QRect
(
QPoint
(
0
,
size
.
height
()),
QSize
(
size
.
width
(),
-
1
*
size
.
height
())));
m_fill_program
.
bind
();
m_fill_program
.
setUniformValue
(
"ortho"
,
ortho
);
m_draw_program
.
bind
();
m_draw_program
.
setUniformValue
(
"ortho"
,
ortho
);
m_draw_program
.
release
();
m_program
.
bind
();
m_program
.
setUniformValue
(
"ortho"
,
ortho
);
m_program
.
release
();
QOpenGLFramebufferObject
*
framebufferObject
=
new
QOpenGLFramebufferObject
(
size
);
emit
FBOTextureChanged
(
framebufferObject
->
texture
(),
ortho
);
...
...
@@ -107,7 +85,7 @@ void VncRenderer::synchronize(QQuickFramebufferObject *object)
m_copy_count
=
dispatcher
->
copy_count
();
m_draw_count
=
dispatcher
->
draw_count
();
m_
fill_
program
.
bind
();
m_
fill_
program
.
setUniformValue
(
"colormax"
,
dispatcher
->
colorMax
());
m_
fill_
program
.
release
();
m_program
.
bind
();
m_program
.
setUniformValue
(
"colormax"
,
dispatcher
->
colorMax
());
m_program
.
release
();
}
vncrenderer.h
View file @
14d916c7
...
...
@@ -11,6 +11,7 @@
#include <QOpenGLBuffer>
#include <QOpenGLTexture>
#include <QSharedPointer>
#include <QTime>
#include "qvnc.h"
...
...
@@ -19,10 +20,8 @@ class VncRenderer : public QObject, public QQuickFramebufferObject::Renderer
Q_OBJECT
public
:
VncRenderer
(
QQuickWindow
*
window
,
Q
OpenGLBuffer
fill_buffer
,
Q
SharedPointer
<
QOpenGLBuffer
>
vertices
,
QSharedPointer
<
QVector
<
GLuint
>>
copy_textures
,
QOpenGLBuffer
copy_buffer
,
QOpenGLBuffer
draw_buffer
,
QSharedPointer
<
QVector
<
QOpenGLTexture
*>>
draw_textures
,
QObject
*
parent
=
0
);
protected
:
...
...
@@ -30,21 +29,19 @@ protected:
QOpenGLFramebufferObject
*
createFramebufferObject
(
const
QSize
&
size
)
override
;
void
synchronize
(
QQuickFramebufferObject
*
)
override
;
private
:
QSharedPointer
<
QOpenGLBuffer
>
m_vertices
;
QOpenGLShaderProgram
m_program
;
QQuickWindow
*
m_window
;
QOpenGLFunctions
*
m_functions
;
bool
m_clear
;
int
m_frameCount
;
QTime
m_time
;
unsigned
int
m_fill_count
;
QOpenGLShaderProgram
m_fill_program
;
QOpenGLBuffer
m_fill_buffer
;
unsigned
int
m_copy_count
;
QSharedPointer
<
QVector
<
GLuint
>>
m_copy_textures
;
QOpenGLBuffer
m_copy_buffer
;
unsigned
int
m_draw_count
;
QOpenGLShaderProgram
m_draw_program
;
Q
OpenGLBuffer
m_draw_buffer
;
Q
SharedPointer
<
QVector
<
GLuint
>>
m_copy_textures
;
QSharedPointer
<
QVector
<
QOpenGLTexture
*>>
m_draw_textures
;
signals
:
void
FBOTextureChanged
(
const
unsigned
int
FBOTexture
,
const
QMatrix4x4
&
ortho
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment