Utilisation avancée des processeurs graphiques avec Qt
Utilisation avancée des processeurs graphiques avec Qt
Utilisation avancée des processeurs graphiques avec Qt
Create successful ePaper yourself
Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.
<strong>Utilisation</strong> <strong>avancée</strong> <strong>des</strong> <strong>processeurs</strong> <strong>graphiques</strong> <strong>avec</strong> <strong>Qt</strong> par Rémi Achard Guillaume Belz<br />
cl<br />
sum_normal += getNormal(in, vector_plan, pos);<br />
}<br />
sum_normal = normalize(sum_normal);<br />
//sum_normal.w = 1.0;<br />
return sum_normal;<br />
}<br />
//-----------------------------------------------------------------------------------------------------------<br />
//-----------------------------------------------------------------------------------------------------------<br />
__kernel void NormalsUpdate(<br />
__global const float4* in, // int points vector<br />
__global float4* out, // out normals vector<br />
const int size, // size of vectors<br />
const int width) // map width<br />
{<br />
const int global_id = get_global_id(0);<br />
if (global_id < size)<br />
{<br />
out[global_id] = getSumNormal(in, global_id, width);<br />
}<br />
}<br />
5.3.3 - Partager <strong>des</strong> données entre OpenCL et OpenGL<br />
Dans la partie précédente, nous avons acceléré le calcul <strong>des</strong> normales en utilisant le GPU. Néanmoins, il est<br />
dommage de devoir récupéré le buffer de résultat d'OpenCL, depuis le GPU vers le CPU, pour le renvoyer ensuite<br />
au GPU dans un VBO.<br />
OpenCL dispose d'une fonctionnalité interessante dans notre cas : le partage de contexte entre OpenGL et OpenCL.<br />
En utilisant cette fonctionnalité, il est possible de stocker directement les résultats d'OpenCL dans le VBO contenant<br />
les normales, nous évitant un allé-retour vers la mémoire système inutile.<br />
Le partage OpenCL / OpenGL est implémenté à l'aide de la classe QCLContextGL. Un contexte OpenGL doit être<br />
actif à la création du contexte CL/GL. Ce partage de données entre les deux contextes necessite la présence d'une<br />
extension OpenCL : cl_khr_gl_sharing. Sa présence peut être testée <strong>avec</strong> la fonction supportsObjectSharing() de<br />
la classe QCLContextGL.<br />
cpp<br />
QCLContextGL GPUContextGL ;<br />
makeCurrent();<br />
if(!GPUContextGL.create())<br />
qFatal("Could not create OpenCL / OpenGL context");<br />
Outre le changement de contexte (QCLContext vers QCLContextGL), les différences par rapport au programme de<br />
la partie précédente apparaissent au niveau de la création et libération <strong>des</strong> buffers. Existant déjà coté GPU sous la<br />
forme de VBO, seul <strong>des</strong> pointeurs vers ces buffers seront récupérés.<br />
La fonction createGLBuffer() de la classe QCLContextGL récupère le pointeur vers un buffer OpenGL grâce à son<br />
identifiant (obtenu <strong>avec</strong> la fonction bufferId() de la classe QGLBuffer).<br />
cpp<br />
QCLBuffer gpu_in_vector = GPUContextGL.createGLBuffer(vertex_buffer.bufferId(),<br />
QCLMemoryObject::ReadOnly);<br />
QCLBuffer gpu_out_vector = GPUContextGL.createGLBuffer(normal_buffer.bufferId(),<br />
QCLMemoryObject::ReadWrite);<br />
Avant d'effectuer tout type d'opération à l'aide d'OpenCL sur ces buffers, il est impératif d'appeler la méthode acquire().<br />
- 76 -<br />
http://gbelz.developpez.com/remi-achard/gpu-avance-<strong>avec</strong>-qt/modified/