26.06.2013 Views

Utilisation avancée des processeurs graphiques avec Qt

Utilisation avancée des processeurs graphiques avec Qt

Utilisation avancée des processeurs graphiques avec Qt

SHOW MORE
SHOW LESS

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&nbsp;;<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/

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!