IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Ecrire un driver graphique de base. (Juste pour le fun)


Sujet :

Langage C++

  1. #21
    Invité
    Invité(e)
    Par défaut
    Le message d'erreur n'est pas complet.
    A quoi correspond "std::vector<unsigned int>" dans la ligne de code que tu donnes ?
    A un vecteur d'unsigned int, en fait, ce sont toutes les positions des premiers sommet pour chaque face.

    PS : je viens seulement de comprendre en fait il faut une constante, une carte graphique possède combien de mémoire cache en général ? (En gros, je peux stocker combien de vertex à la fois ?)

  2. #22
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 397
    Points : 698
    Points
    698
    Par défaut
    Citation Envoyé par Lolilolight Voir le message
    A un vecteur d'unsigned int, en fait, ce sont toutes les positions des premiers sommet pour chaque face.
    Merci... On recommence.
    A quelle variable correspond ce type ? Dans la ligne de code que tu donnes, tu utilises baseVertices.size() (le size_type probablement du message d'erreur) et nbVerticesPerFaces (un unsigned int). Donc d'ou vient le "std::vector<unsigned int>" donné dans le message d'erreur ?
    (dit autrement, le message d'erreur ne semble pas correspondre a la ligne de code que tu donnes)

    Citation Envoyé par Lolilolight Voir le message
    PS : je viens seulement de comprendre en fait il faut une constante, une carte graphique possède combien de mémoire cache en général ? (En gros, je peux stocker combien de vertex à la fois ?)
    Tu confonds (encore) mémoire cache et mémoire du GPU. La première : quelques ko, la seconde en général au moins 1 Go (sauf probablement sur embarqué).

  3. #23
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 397
    Points : 698
    Points
    698
    Par défaut
    Et qu'est ce qui doit etre constant ???

  4. #24
    Invité
    Invité(e)
    Par défaut
    Et qu'est ce qui doit etre constant ???
    Ca ne compilait pas car le troisième paramètre de cette fonction devait être un litéral constant :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    err = clqueue.enqueueNDRangeKernel(clkvertexShader,
                                                        cl::NullRange, <s>cl::NDRange(baseVertices.size() * nbVerticesPerFaces</s> 1024),
                                                        cl::NDRange(1, 1), NULL, &event);

    Mais que fait cette fonction exactement, je ne suis pas sûr de bien la comprendre, la seule chose que j'ai compris est qu'elle réserve un espace mémoire (workgroup) utilisé par tout les threads, et chaque thread utilise un espace mémoire appelé work-item, et ça fait ainsi comme une sorte de tableau, mais, comment parcourir ce tableau afin de récupérer les bons ids ?

    Par exemple cl::NDRange me génère un thread id par appel au kernel que je récupère avec get_global_id, NDRange(0, 4) va me générer deux thread id qui vont de 0 à 4 alors ?

    Au sinon voici le code que j'ai pour le moment, qui utilise un thread par vertex, mais, je ne sais pas si je le laisse ainsi ou si j'utilise un thread par face plutôt, ça, ça dépendra beaucoup des performances de ma machine.

    Voici le code que j'ai en ce moment :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    #pragma OPENCL EXTENSION cl_khr_byte_addressable_store : enable
    //Multiply two 4*4 matrices.
    float16 multMat (float16 matA, float16 matB) {
        float16 matC;        
        for (int x = 0; x < 4; ++x) {
    	for (int y = 0; y < 4; ++y) {
                float value = 0;
    	    for (int k = 0; k < 4; ++k) {
    		float elementA = matA[y * 4 + k];
                    float elementB = matB[k * 4 + x];
    		value += elementA * elementB;
    	    }
    	    matC[y * 4 + x] = value;		
            }
        }
        return matC;
    }
    //Multiply a 4*4 matrix with a vec4.
    float4 multVec (float16 matA, float4 vecB) {
       float4 vecC;
       for (int i = 0; i < 4; ++i) {
            float value = 0;
    	for (int j = 0; j < 4; ++j) {
                 value += vecB[j] * matA[i][j];
    	}
    	vecC[i] = value;
       }
       return vecC;
    }
    //Transpose a 4*4 matrix.
    float16 transpose(float16 matA) {
    	float16 matT
    	for (int i = 0; i < 4; ++i) {        	
    		for (int j = 0; j < 4; ++j) {
    			matT[i][j] = matA[j][i];
    		}
    	}
    	return matT;
    }
    //Convert vertex position from object space toviewport space.
    __kernel void vertexShader(__global float* vPosX, __global float* vPosY, __global float* vPosZ, __global float* vPosW,
                               __global unsigned int* vColRed, __global unsigned int* vColBlue, __global unsigned int* vColGreen, 				   __global unsigned int* vColAlpha, __global int* vTCU, __global int* vTCV, 
    			   __global unsigned int* indices,  __global unsigned int numIndices, __global unsigned int* baseIndices, 
    			   __global unsigned int* baseVertices,  __global unsigned int* nbVerticesPerFaces, __global float* transfMatrices, 				   __global float16 projMatrix, __global float16 viewMatrix, __global float16 viewportMatrix, 
    			   __global int nbVertices) {
            size_t tid = get_global_id(0);
    	if (tid < nbVertices) {		
    		int instanceID = tid / nbVerticesPerFace;
    		float16 transfMatrix;
    		float4 position = (float4) (vPosX[indices[tid]], vPosY[indices[tid]], vPosZ[indices[tid]], vPosW[indices[tid]]);
    		for (int i = 0; i < 16; i++) {
    		    transfMatrix[i] = transfMatrices[instanceID*16+i];
    		}					
    		float4 worldcoords = multVec(transfMatrix, position);
    		float4 viewcoords = multVec(viewMatrix, worldcoords);
                    float4 clipcoords = multVec(projMatrix, viewcoords);
    		float4 ndcCoords = clipcoords / clipcoords.w;
    		position = multVec(viewportMatrix, ndcCoords);
    		vPosX[tid] = abs(position.x);
                    vPosY[tid] = abs(position.y);
                    vPosZ[tid] = abs(position.z);
                    vPosW[tid] = position.w; 
    	}
     
    }

  5. #25
    Membre éclairé

    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    397
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 397
    Points : 698
    Points
    698
    Par défaut
    Citation Envoyé par Lolilolight Voir le message
    Ca ne compilait pas car le troisième paramètre de cette fonction devait être un litéral constant
    Le 3ème paramètre est juste un cl_uint passé par valeur. Tu n'es pas obligé de passer une littérale (heureusement).
    (cours de C++ débutant)

    Citation Envoyé par Lolilolight Voir le message
    Mais que fait cette fonction exactement, je ne suis pas sûr de bien la comprendre, la seule chose que j'ai compris est qu'elle réserve un espace mémoire (workgroup) utilisé par tout les threads, et chaque thread utilise un espace mémoire appelé work-item, et ça fait ainsi comme une sorte de tableau, mais, comment parcourir ce tableau afin de récupérer les bons ids ?

    Par exemple cl::NDRange me génère un thread id par appel au kernel que je récupère avec get_global_id, NDRange(0, 4) va me générer deux thread id qui vont de 0 à 4 alors ?
    Ouch.
    Tu utilises quel cours ou livre pour étudier OpenCL ?
    Tu mélanges complètement les concepts, n'utilises pas correctement les termes techniques.
    Tu vas faire n'importe quoi si tu n'étudies pas sérieusement les choses.

    Citation Envoyé par Lolilolight Voir le message
    Au sinon voici le code que j'ai pour le moment, qui utilise un thread par vertex, mais, je ne sais pas si je le laisse ainsi ou si j'utilise un thread par face plutôt, ça, ça dépendra beaucoup des performances de ma machine.
    L'équivalent OpenGL dépend du stage dans le pipeline :
    - un thread par géométrie dans les geometry shader et tesselation shader
    - un thread par vertex dans le vertex shader
    - un thread pas pixel dans le fragment/pixel shader
    Donc tout dépend de ce que tu veux faire

  6. #26
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par mintho carmo Voir le message
    - un thread pas pixel dans le fragment/pixel shader
    Je croyais que c'était un thread par fragment, avec un fragment = 4 (valeur fixe ? dépendante du matériel ?) pixels ?

  7. #27
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 896
    Points : 219 548
    Points
    219 548
    Billets dans le blog
    125
    Par défaut
    Oui Iradrille, c'est un thread par fragment (d'ailleurs on devrait dire fragment shader) et le nombre de pixel géré par fragment dépend du matériel.
    Mais bon, on peux résumer/extrapoler en disant un thread par pixel, car au final, nous voyons (dans le pixel shader/thread) que le pixel (et non le fragment) et c'est la carte graphique qui split le fragment, si jamais il y a deux pixels n'ayant pas les mêmes couleurs (genre, sur les bordures de mesh).

  8. #28
    Invité
    Invité(e)
    Par défaut
    Ou se trouvent les messages d'erreur de compilation pour les fichiers .cl ?

    PS : Il me faudrait un bouquin ou quelque chose du genre sur openCL car là, ça devient compliqué. :/

Discussions similaires

  1. Ecrire un driver pour linux
    Par otspot dans le forum C
    Réponses: 1
    Dernier message: 30/12/2008, 17h45
  2. Juste pour le fun - Tri alphabétique d'un tableau()
    Par ouskel'n'or dans le forum Contribuez
    Réponses: 0
    Dernier message: 23/05/2008, 19h43
  3. [juste pour le fun] Recensement des rangs spéciaux DVP
    Par guidav dans le forum La taverne du Club : Humour et divers
    Réponses: 2
    Dernier message: 26/07/2007, 09h00
  4. Driver graphique de base
    Par pfeuh dans le forum C
    Réponses: 2
    Dernier message: 31/01/2007, 10h57
  5. export base donnée pour représentation graphique des tables
    Par calitom dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 04/11/2006, 13h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo