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. #1
    Invité
    Invité(e)
    Par défaut Ecrire un driver graphique de base. (Juste pour le fun)
    Salut, je souhaiterai écrire un driver graphique de base, juste pour le fun, une technologie similaire à OpenCL avec juste des allocations de buffers, du transfert de données, etc...

    Mais je ne sais pas par ou commencer.

    Comme d'habitude je n'ai pas envie de rentrer dans un code existant volumineux, surtout si celui-ci n'est pas documenté.

    Car, j'ai vraiment du mal de trouver de tutoriels C++ là dessus d'autant plus que cela dépend fort de chaque modèle de carte graphique.

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 352
    Points : 42 823
    Points
    42 823
    Par défaut
    OpenCL n'est pas un driver graphique mais une API.

    Que veux-t faire exactement ?
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Invité
    Invité(e)
    Par défaut
    De la programmation au niveau de la carte graphique, mais pas au niveau de l'api, à plus bas niveau. (Comme on le fait pour le CPU quoi!)

    Le problème des apis est quelle ne sont pas toujours supportée par les cartes graphiques. (Contrairement à un langage qui lui, l'est, comme par exemple, le c++ mais ce n'est que pour le CPU. :/)

    J'ai l'impression qu'il faudra que j'attente la sortie de VULKAN et que je m'achète un troisième PC. :/

  4. #4
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    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 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    Par défaut
    Bonjour,

    De la programmation au niveau de la carte graphique
    On ne peux pas programmer dans les cartes graphiques. Le seul code que nous pouvons exécuter sur une carte graphique est celui des shaders (GLSL/HLSL), ou des kernels (OpenCL/CUDA/...).

    Au final, les cartes graphiques sont un bloc opaque et on ne peux pas y accéder facilement.
    La piste que je vous donnerai, qui est la plus proche de ce que vous voulez faire, c'est Mesa. Plus bas niveau encore : Gallium.

    C'est une implémentation, libre et open source d'OpenGL. Par contre, lorsqu'ils arrivent à jouer avec la carte graphique, c'est qu'ils ont compris comment elle fonctionnait, souvent en reverse engeenering.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  5. #5
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 352
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 352
    Points : 42 823
    Points
    42 823
    Par défaut
    C'est une implémentation, libre et open source d'OpenGL. Par contre, lorsqu'ils arrivent à jouer avec la carte graphique, c'est qu'ils ont compris comment elle fonctionnait, souvent en reverse engeenering.
    Je rajouterai que du coup si ça marche pour une carte, ça ne marchera pas pour une autre.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  6. #6
    Invité
    Invité(e)
    Par défaut
    J'ai tenté ce bout de code :

    Code : 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
     
    #include <utility>
    #include <CL/cl.hpp>
    #include <cstdio>
    #include <cstdlib>
    #include <fstream>
    #include <iostream>
    #include <string>
    #include <iterator>
    inline void checkErr(cl_int err, const char * name) {
        if (err != CL_SUCCESS) {
          std::cerr << "ERROR: " << name  << " (" << err << ")" << std::endl;
          exit(EXIT_FAILURE);
       }
    }
    const std::string hw("Hello World\n");
    int main(void) {
        cl_int err;
        std::vector< cl::Platform > platformList;
        cl::Platform::get(&platformList);
        checkErr(platformList.size()!=0 ? CL_SUCCESS : -1, "cl::Platform::get");
        std::cerr << "Platform number is: " << platformList.size() << std::endl;std::string platformVendor;
        platformList[0].getInfo((cl_platform_info)CL_PLATFORM_VENDOR, &platformVendor);
        std::cerr << "Platform is by: " << platformVendor << "\n";
        cl_context_properties cprops[3] = {CL_CONTEXT_PLATFORM, (cl_context_properties)(platformList[0])(), 0};cl::Context context(
          CL_DEVICE_TYPE_GPU,
          cprops,
          NULL,
          NULL,
          &err);
        checkErr(err, "Context::Context()");
        return EXIT_SUCCESS;
    }
    Mais ça ne fonctionne pas, il me dit que je n'ai qu'une plateforme de type CPU, hors que j'ai bien une carte graphique dans mon ordinateur.

    Je vais aller voir sur le forum d'openCL, si je ne peux pas trouver une solution à ce problème.

    Car avec mesa ça fonctionne bien.

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


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    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 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    Par défaut
    Peut être vous avez deux entrées, dans platformList
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Deux entrées dans une liste ? Je ne comprends pas bien...

    En tout cas il n'y a qu'une plateforme dans la liste, remplacer le "0" par le "1" entre les corchets me donne une belle erreur de segmentation.

    PS : la plateforme Intel permet d'utiliser les deux (CPU et GPU), maintenant, il ne me reste plus qu'à savoir comment utiliser l'un ou l'autre au niveau de l'api!

    J'espère que ça ira mieux au niveau des perfs et je n'aurai sans doute plus ce problème de support du langage GLSL sur différentes carte graphiques!

  9. #9
    Membre éclairé

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

    Informations forums :
    Inscription : Décembre 2013
    Messages : 393
    Points : 684
    Points
    684
    Par défaut
    (sauf erreur de ma part, je crois que le but n'est pas de créer un driver GPU, mais de recréer le pipeline graphique en utilisant OpenCL. Pas pareil)

    Niveau performance, cela m'étonnerait. OpenGL est assez bien supporté de nos jours, OpenCL probablement moins, et tu ne pourras implémenter que 1% (et c'est déjà beaucoup) des fonctionnalités d'OpenGL.

    Mais si c'est juste pour le fun, ce n'est pas très grave de ne pas avoir un maximum de performances, suffit de continuer à utiliser OpenGL pour les "vrais" projets.

    Lorsque tu as plusieurs device, le choix se fait lors de la création du contexte. Ensuite, tous les appels de fonction sur le contexte concerneront le device sélectionné.

    Si tu ne vois qu'un seul device, c'est probablement que tu n'as pas le drivers OpenCL installés sont ton ordi.

  10. #10
    Invité
    Invité(e)
    Par défaut
    J'ai juste besoin de 1% des fonctionnalités de openGL. ^^

    La seule chose que je recherche maintenant c'est la performance..., je veux surtout voir si mon processeur intel sera capable d'appeler le bon device, pour le moment je n'ai qu'un device avec openCL, le CPU, mais j'ai peut être loupé quelque chose dans les tutoriels, il faut que je pose ma question sur le forum d'AMD.

  11. #11
    Membre éclairé

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

    Informations forums :
    Inscription : Décembre 2013
    Messages : 393
    Points : 684
    Points
    684
    Par défaut
    As tu installé les drivers de ta carte graphique AMD ? Et quels drivers ?

  12. #12
    Invité
    Invité(e)
    Par défaut
    As tu installé les drivers de ta carte graphique AMD ? Et quels drivers ?
    -Le driver OpenCL.
    -J'ai aussi installé mesa.

    PS : J'ai modifier le code pour récupérer le second device d'id 1 mais ici j'ai une autre erreur de code en créant le contexte. (-30)

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     cl_context_properties cprops[3] = {CL_CONTEXT_PLATFORM, (cl_context_properties)(platformList[0])(), 1};cl::Context context(
          CL_DEVICE_TYPE_GPU,
          cprops,
          NULL,
          NULL,
          &err);

    Comment est ce que je peux retrouvé l'erreur correspondant au code -30 ?

    PS 2 : J'ai des valeurs invalide mais que dois je mettre comme valeurs si je veux utiliser le GPU ?
    Dernière modification par Invité ; 26/05/2015 à 10h06.

  13. #13
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    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 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    Par défaut
    Citation Envoyé par Lolilolight Voir le message
    PS 2 : J'ai des valeurs invalide mais que dois je mettre comme valeurs si je veux utiliser le GPU ?
    En comparant avec les enums indiqués en bas de cette page : https://www.khronos.org/registry/cl/...ocs/man/xhtml/
    Comme en OpenGL, j'ai envie de dire .
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  14. #14
    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 Lolilolight Voir le message
    PS : J'ai modifier le code pour récupérer le second device d'id 1 mais ici j'ai une autre erreur de code en créant le contexte. (-30)
    properties

    Specifies a list of context property names and their corresponding values. Each property name is immediately followed by the corresponding desired value. The list is terminated with 0. properties can be NULL in which case the platform that is selected is implementation-defined. The list of supported properties is described in the table below.
    Ce 0 n'est pas le numéro du device à-priori.

    Cf doc wrapper C++, et doc openCL.

    Tu as essayé un simple ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    cl_int err;
    cl::Context context(CL_DEVICE_TYPE_GPU, nullptr, nullptr, nullptr, &err);
     
    switch(err) {
    case CL_INVALID_PLATFORM: std::cout << "if properties is NULL and no platform could be selected or if platform value specified in properties is not a valid platform."; break;
    case CL_INVALID_VALUE: std::cout << "if context property name in properties is not a supported property name, or if pfn_notify is NULL but user_data is not NULL."; break;
    case CL_INVALID_VALUE: std::cout << "if pfn_notify is NULL but user_data is not NULL."; break;
    case CL_DEVICE_NOT_AVAILABLE: std::cout << "if no devices that match device_type are currently available."; break;
    case CL_DEVICE_NOT_FOUND: std::cout << " if no devices that match device_type were found."; break;
    case CL_OUT_OF_HOST_MEMORY: std::cout << " if there is a failure to allocate resources required by the OpenCL implementation on the host."; break;
    case CL_INVALID_DEVICE_TYPE: std::cout << " if device_type is not a valid value."; break;
    default: std::cout << "ok";
    }
     
    std::cout << std::endl;

  15. #15
    Invité
    Invité(e)
    Par défaut
    Oui mais ne fonctionne pas non plus. (J'ai le code d'erreur -1 à la création du contexte)

    Mais j'ai une autre erreur aussi maintenant, en fait je voudrais rendre une face comportant n sommets (chaque faces comportant le même nombre de sommet est une instance), chaque instance peut avoir une matrice de transformation différente.

    J'ai donc pensé à faire quelque chose comme ceci : (En ayant regroupé tout mes sommets utilisant le même matériel et appartenant au même type de face)

    Je souhaiterais faire de l'indirect rendering, j'ai donc écrit le code suivant.

    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
    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
     
    for (unsigned int i = 0; i < m_instances.size(); i++) {
                    std::vector<float> transformMatrices;
                    for (unsigned int j = 0; j < m_instances[i]->getTransforms().size(); j++) {
                        float* tmatrix = m_instances[i]->getTransforms()[j].get().getGlMatrix();
                        for (unsigned int n = 0; n < 16; n++) {
                            transformMatrices.push_back(tmatrix[n]);
                        }
                    }
                    cl_int err;
                    ctransfMatrixBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, transformMatrices.size(), &transformMatrices, &err);
                    checkErr(err, "Buffer::Buffer()");
                    math::Matrix4f texM = (m_instances[i]->getMaterial().getTexture() != nullptr) ?
                        m_instances[i]->getMaterial().getTexture()->getTextureMatrix() :
                        math::Matrix4f();
                    std::vector<float> vPosX = m_instances[i]->getVertexArray().m_vPosX;
                    std::vector<float> vPosY = m_instances[i]->getVertexArray().m_vPosY;
                    std::vector<float> vPosZ = m_instances[i]->getVertexArray().m_vPosZ;
                    std::vector<float> vPosW = m_instances[i]->getVertexArray().m_vPosW;
                    std::vector<unsigned char> vcRed = m_instances[i]->getVertexArray().m_vcRed;
                    std::vector<unsigned char> vcBlue = m_instances[i]->getVertexArray().m_vcBlue;
                    std::vector<unsigned char> vcGreen = m_instances[i]->getVertexArray().m_vcGreen;
                    std::vector<unsigned char> vcAlpha = m_instances[i]->getVertexArray().m_vcAlpha;
                    std::vector<unsigned int> ctx = m_instances[i]->getVertexArray().m_ctX;
                    std::vector<unsigned int> cty = m_instances[i]->getVertexArray().m_ctY;
                    std::vector<unsigned int> indexes = m_instances[i]->getVertexArray().m_indexes;
                    std::vector<unsigned int> numIndexes = m_instances[i]->getVertexArray().m_numIndexes;
                    std::vector<unsigned int> baseIndexes = m_instances[i]->getVertexArray().m_baseIndexes;
                    std::vector<unsigned int> baseVertices = m_instances[i]->getVertexArray().m_baseVertices;
                    unsigned int nbVerticesPerFaces = m_instances[i]->getVertexArray().nbVerticesPerFace;
                    cvposXBuffer = cl::Buffer(clcontext, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, vPosX.size(), &vPosX, &err);
                    checkErr(err, "Buffer::Buffer()");
                    cvposYBuffer = cl::Buffer(clcontext, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, vPosX.size(), &vPosY, &err);
                    checkErr(err, "Buffer::Buffer()");
                    cvposZBuffer = cl::Buffer(clcontext, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, vPosX.size(), &vPosZ, &err);
                    checkErr(err, "Buffer::Buffer()");
                    cvposWBuffer = cl::Buffer(clcontext, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, vPosX.size(), &vPosW, &err);
                    checkErr(err, "Buffer::Buffer()");
                    cvcolredBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, vcRed.size(), &vcRed, &err);
                    checkErr(err, "Buffer::Buffer()");
                    cvcolgreenBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, vcBlue.size(), &vcBlue, &err);
                    checkErr(err, "Buffer::Buffer()");
                    cvcolblueBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, vcGreen.size(), &vcGreen, &err);
                    checkErr(err, "Buffer::Buffer()");
                    cvcolalphaBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, vcAlpha.size(), &vcAlpha, &err);
                    checkErr(err, "Buffer::Buffer()");
                    cvtexcoorduBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, ctx.size(), &ctx, &err);
                    checkErr(err, "Buffer::Buffer()");
                    cvtexcoordvBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, cty.size(), &cty, &err);
                    checkErr(err, "Buffer::Buffer()");
                    cvindexesBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, indexes.size(), &indexes, &err);
                    checkErr(err, "Buffer::Buffer()");
                    cnumIndexesBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, numIndexes.size(), &numIndexes, &err);
                    checkErr(err, "Buffer::Buffer()");
                    cbaseIndexesBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, baseIndexes.size(), &baseIndexes, &err);
                    checkErr(err, "Buffer::Buffer()");
                    cbaseVerticesBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, baseVertices.size(), &baseVertices, &err);
                    checkErr(err, "Buffer::Buffer()");
                    cNbVerticesPerFaces = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, 1, nbVerticesPerFaces, &err);
                    checkErr(err, "Buffer::Buffer()");
                    View& view = window.getView();
                    ViewportMatrix vpm;
                    vpm.setViewport(math::Vec3f(view.getViewport().getPosition().x, view.getViewport().getPosition().y, 0),
                    math::Vec3f(view.getViewport().getWidth(), view.getViewport().getHeight(), 1));
                    float* projMatrix = view.getProjMatrix().getMatrix().toGlMatrix();
                    float* viewMatrix = view.getViewMatrix().getMatrix().toGlMatrix();
                    float* viewportMatrix = vpm.getMatrix().toGlMatrix();
                    cprojMatrixBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, 16, *projMatrix, &err);
                    checkErr(err, "Buffer::Buffer()");
                    cviewMatrixBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, 16, *viewMatrix, &err);
                    checkErr(err, "Buffer::Buffer()");
                    cvpMatrixBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, 16, *viewportMatrix, &err);
                    std::vector<float> transfMatrices;
                    checkErr(err, "Buffer::Buffer()");
                    checkErr(err, "Buffer::Buffer()");
                    err = clkvertexShader.setArg(0, cvposXBuffer);
                    checkErr(err, "Kernel::setArg()");
                    err = clkvertexShader.setArg(1, cvposYBuffer);
                    checkErr(err, "Kernel::setArg()");
                    err = clkvertexShader.setArg(2, cvposZBuffer);
                    checkErr(err, "Kernel::setArg()");
                    err = clkvertexShader.setArg(3, cvposWBuffer);
                    checkErr(err, "Kernel::setArg()");
                    err = clkvertexShader.setArg(4, cvcolredBuffer);
                    checkErr(err, "Kernel::setArg()");
                    err = clkvertexShader.setArg(5, cvcolblueBuffer);
                    checkErr(err, "Kernel::setArg()");
                    err = clkvertexShader.setArg(6, cvcolgreenBuffer);
                    checkErr(err, "Kernel::setArg()");
                    err = clkvertexShader.setArg(7, cvcolalphaBuffer);
                    checkErr(err, "Kernel::setArg()");
                    err = clkvertexShader.setArg(8, cvtexcoorduBuffer);
                    checkErr(err, "Kernel::setArg()");
                    err = clkvertexShader.setArg(9, cvtexcoordvBuffer);
                    checkErr(err, "Kernel::setArg()");
                    err = clkvertexShader.setArg(10, cvindexesBuffer);
                    checkErr(err, "Kernel::setArg()");
                    err = clkvertexShader.setArg(11, cnumIndexesBuffer);
                    checkErr(err, "Kernel::setArg()");
                    err = clkvertexShader.setArg(12, cbaseIndexesBuffer);
                    checkErr(err, "Kernel::setArg()");
                    err = clkvertexShader.setArg(13, cbaseVerticesBuffer);
                    checkErr(err, "Kernel::setArg()");
                    err = clkvertexShader.setArg(14, cNbVerticesPerFaces);
                    checkErr(err, "Kernel::setArg()");
                    cl::CommandQueue clqueue (clcontext, devices[0], 0, &err);
                    checkErr(err, "CommandQueue::CommandQueue()");
                    cl::Event event;
                    err = clqueue.enqueueNDRangeKernel(clkvertexShader,
                                                        cl::NullRange, cl::NDRange(baseVertices.size() * nbVerticesPerFaces),
                                                        cl::NDRange(1, 1), NULL, &event);

    Par exemple 1 point par face = des points, 2 = des lignes, 3 = des triangles, 4 = des quads, etc..., etc...
    Et je n'aurai plus qu'à rasteriser.

    Le soucis c'est que j'ai une erreur en compilation, je ne comprend pas car je n'avais pas ce problème de compilation au départ :

    Code : 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
     
    ||=== Build: Release in ODFAEG (compiler: GNU GCC Compiler) ===|
    ||WARNING: Can't read file's timestamp: /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Audio/ALCheck.cpp|
    ||WARNING: Can't read file's timestamp: /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Audio/AudioDevice.cpp|
    ||warning: optimization flag '-fexpensive-optimizations' is not supported|
    ||warning: argument unused during compilation: '-fexpensive-optimizations'|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/../../../include/odfaeg/Graphics/../Math/../../../include/odfaeg/Core/fastDelegate.h|170|warning: 'RefVal' defined as a struct template here but previously declared as a class template [-Wmismatched-tags]|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/../../../include/odfaeg/Graphics/../Math/../../../include/odfaeg/Core/fastDelegate.h|70|note: did you mean struct here?|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/../../../include/odfaeg/Graphics/../Math/../../../include/odfaeg/Core/resourceManager.h|528|warning: unused variable 'id' [-Wunused-variable]|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/../../../include/odfaeg/Graphics/../Physics/boundingVolume.h|60|warning: 'odfaeg::physic::BoundingVolume::intersects' hides overloaded virtual functions [-Woverloaded-virtual]|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/../../../include/odfaeg/Graphics/../Physics/boundingVolume.h|36|note: hidden overloaded virtual function 'odfaeg::physic::BaseInterface::intersects' declared here: type mismatch at 1st parameter ('odfaeg::physic::BoundingBox &' vs 'odfaeg::physic::BaseInterface &')|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/../../../include/odfaeg/Graphics/../Physics/boundingVolume.h|37|note: hidden overloaded virtual function 'odfaeg::physic::BaseInterface::intersects' declared here: type mismatch at 1st parameter ('odfaeg::physic::BoundingSphere &' vs 'odfaeg::physic::BaseInterface &')|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/../../../include/odfaeg/Graphics/../Physics/boundingVolume.h|38|note: hidden overloaded virtual function 'odfaeg::physic::BaseInterface::intersects' declared here: type mismatch at 1st parameter ('odfaeg::physic::BoundingEllipsoid &' vs 'odfaeg::physic::BaseInterface &')|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/../../../include/odfaeg/Graphics/../Physics/boundingVolume.h|39|note: hidden overloaded virtual function 'odfaeg::physic::BaseInterface::intersects' declared here: type mismatch at 1st parameter ('odfaeg::physic::OrientedBoundingBox &' vs 'odfaeg::physic::BaseInterface &')|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/../../../include/odfaeg/Graphics/../Physics/boundingVolume.h|40|note: hidden overloaded virtual function 'odfaeg::physic::BaseInterface::intersects' declared here: type mismatch at 1st parameter ('odfaeg::physic::BoundingPolyhedron &' vs 'odfaeg::physic::BaseInterface &')|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/../../../include/odfaeg/Graphics/../Physics/../Math/computer.h|187|warning: '&&' within '||' [-Wlogical-op-parentheses]|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/../../../include/odfaeg/Graphics/../Physics/../Math/computer.h|187|note: place parentheses around the '&&' expression to silence this warning|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/../../../include/odfaeg/Graphics/../Physics/../Math/computer.h|187|warning: '&&' within '||' [-Wlogical-op-parentheses]|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/../../../include/odfaeg/Graphics/../Physics/../Math/computer.h|187|note: place parentheses around the '&&' expression to silence this warning|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/../../../include/odfaeg/Graphics/../Physics/../Math/computer.h|292|warning: '&&' within '||' [-Wlogical-op-parentheses]|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/../../../include/odfaeg/Graphics/../Physics/../Math/computer.h|292|note: place parentheses around the '&&' expression to silence this warning|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/../../../include/odfaeg/Graphics/../Physics/../Math/computer.h|292|warning: '&&' within '||' [-Wlogical-op-parentheses]|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/../../../include/odfaeg/Graphics/../Physics/../Math/computer.h|292|note: place parentheses around the '&&' expression to silence this warning|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/../../../include/odfaeg/Graphics/../Physics/../Math/computer.h|416|warning: '&&' within '||' [-Wlogical-op-parentheses]|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/../../../include/odfaeg/Graphics/../Physics/../Math/computer.h|416|note: place parentheses around the '&&' expression to silence this warning|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/../../../include/odfaeg/Graphics/../Physics/../Math/computer.h|416|warning: '&&' within '||' [-Wlogical-op-parentheses]|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/../../../include/odfaeg/Graphics/../Physics/../Math/computer.h|416|note: place parentheses around the '&&' expression to silence this warning|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/../../../include/odfaeg/Graphics/../Math/../../../include/odfaeg/Core/stateParameter.h|32|warning: field 'name' will be initialized after field 'value' [-Wreorder]|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/cpuRenderComponent.cpp|254|warning: address of 'err' will always evaluate to 'true' [-Wpointer-bool-conversion]|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/cpuRenderComponent.cpp|263|warning: address of 'err' will always evaluate to 'true' [-Wpointer-bool-conversion]|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/cpuRenderComponent.cpp|265|warning: address of 'err' will always evaluate to 'true' [-Wpointer-bool-conversion]|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/cpuRenderComponent.cpp|267|warning: address of 'err' will always evaluate to 'true' [-Wpointer-bool-conversion]|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/cpuRenderComponent.cpp|208|warning: unused variable 'texM' [-Wunused-variable]|
    ../../../../../usr/include/CL/cl.hpp|6175|error: no type named 'value_type' in 'std::iterator_traits<int>'|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/cpuRenderComponent.cpp:254:39: note||in instantiation of function template specialization 'cl::Buffer::Buffer<int>' requested here|
    ../../../../../usr/include/CL/cl.hpp|6192|error: indirection requires pointer operand ('int' invalid)|
    ../../../../../usr/include/CL/cl.hpp|6373|error: no type named 'value_type' in 'std::iterator_traits<int>'|
    ../../../../../usr/include/CL/cl.hpp:6209:21: note||in instantiation of function template specialization 'cl::copy<int>' requested here|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/cpuRenderComponent.cpp:254:39: note||in instantiation of function template specialization 'cl::Buffer::Buffer<int>' requested here|
    /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_algobase.h|387|error: no type named 'value_type' in 'std::iterator_traits<int>'|
    /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_algobase.h:432:23: note||in instantiation of function template specialization 'std::__copy_move_a<false, int, int *>' requested here|
    /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_algobase.h:464:20: note||in instantiation of function template specialization 'std::__copy_move_a2<false, int, int *>' requested here|
    ../../../../../usr/include/CL/cl.hpp:6392:10: note||in instantiation of function template specialization 'std::copy<int, int *>' requested here|
    ../../../../../usr/include/CL/cl.hpp:6209:21: note||in instantiation of function template specialization 'cl::copy<int>' requested here|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/cpuRenderComponent.cpp:254:39: note||in instantiation of function template specialization 'cl::Buffer::Buffer<int>' requested here|
    /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_algobase.h|389|error: no type named 'iterator_category' in 'std::iterator_traits<int>'|
    /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_algobase.h|306|error: indirection requires pointer operand ('int' invalid)|
    /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_algobase.h:396:36: note||in instantiation of function template specialization 'std::__copy_move<false, false, int>::__copy_m<int, int *>' requested here|
    /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_algobase.h:432:23: note||in instantiation of function template specialization 'std::__copy_move_a<false, int, int *>' requested here|
    /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/stl_algobase.h:464:20: note||in instantiation of function template specialization 'std::__copy_move_a2<false, int, int *>' requested here|
    ../../../../../usr/include/CL/cl.hpp:6392:10: note||in instantiation of function template specialization 'std::copy<int, int *>' requested here|
    ../../../../../usr/include/CL/cl.hpp:6209:21: note||in instantiation of function template specialization 'cl::copy<int>' requested here|
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/cpuRenderComponent.cpp:254:39: note||in instantiation of function template specialization 'cl::Buffer::Buffer<int>' requested here|
    ||=== Build failed: 6 error(s), 33 warning(s) (0 minute(s), 2 second(s)) ===|
    Voilà merci d'avance pour votre aide.

  16. #16
    Membre éclairé

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

    Informations forums :
    Inscription : Décembre 2013
    Messages : 393
    Points : 684
    Points
    684
    Par défaut
    Les warnings ne sont pas optionnels, il faut les corriger. Utilise -Werror

    Quand tu donnes un fragment de code et les messages d'erreur correspondant, les numéros de ligne ne correspondent pas. Il faut dire a quelle ligne correspond les erreurs.

    Je suppose que cela vient de cette ligne (et des suivantes ou tu utilises un cl::Buffer) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ctransfMatrixBuffer = cl::Buffer(clcontext, CL_MEM_READ_ONLY | CL_MEM_USE_HOST_PTR, transformMatrices.size(), &transformMatrices, &err);
    A quoi correspond ton &transformMatrices ? A priori, ce n'est pas bon

  17. #17
    Invité
    Invité(e)
    Par défaut
    A quoi correspond ton &transformMatrices ? A priori, ce n'est pas bon
    Ca correspond à un vecteur de nombres flottants.

    Chaque nombre est juste l'élément d'une matrice, je devrai surement utiliser un kernel à part pour effectuer les multiplications matricielles.

  18. #18
    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 Lolilolight Voir le message
    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector<float> vPosX = m_instances[i]->getVertexArray().m_vPosX;
    cvposXBuffer = cl::Buffer(clcontext, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, vPosX.size(), &vPosX, &err);
    Çà me semble suspect : il faut donner l'adresse des données, et non l'adresse du vector (?)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cvposXBuffer = cl::Buffer(clcontext, CL_MEM_READ_WRITE | CL_MEM_USE_HOST_PTR, vPosX.size(), vPosX.data(), &err);
    Sinon, si je comprend bien tu n'entrelaces pas les données (c'est généralement conseillé), mais pire, tu fournis tes positions sous formes de 4 buffers différents, tu devrais vraiment regarder du coté de vec4.

    edit : c'est aussi une copie possiblement inutile du vector, une ref constante serait probablement suffisante.

  19. #19
    Invité
    Invité(e)
    Par défaut
    Justement je ne connais pas les différents types que je peux passer comme argument au kernel.

    C'est pour ça que j'ai fait des std::vector sur des types primitifs. (float, unsigned char, unsigned int, etc...)

    Ok donc c'est .data() que je dois utiliser pour avoir l'adresse du premier élément du vector.

    Avec .data() ça compile bien avec les tableaux statiques (std::array) et dynamiques (std::vector), cependant, j'ai une dernière erreur ici :

    La taille du buffer c'est le nombre de faces de même type multiplié par le nombre de sommets par faces, je peux alors, à l'aide des indices, récupérer tout les attributs de sommets et les matrices pour chaque instance indirectement.

    Malheureusement, je ne parviens pas à passer la taille des buffers au kernel.

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

    Ceci me génère une erreur de compilation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    /home/laurent/Développement/Projets-c++/ODFAEG/src/odfaeg/Graphics/cpuRenderComponent.cpp|304|error: invalid operands to binary expression ('size_type' (aka 'unsigned long') and 'std::vector<unsigned int>')|
    Dernière modification par LittleWhite ; 28/05/2015 à 14h31.

  20. #20
    Membre éclairé

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

    Informations forums :
    Inscription : Décembre 2013
    Messages : 393
    Points : 684
    Points
    684
    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 ?

Discussions similaires

  1. Ecrire un driver pour linux
    Par otspot dans le forum C
    Réponses: 1
    Dernier message: 30/12/2008, 18h45
  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, 20h43
  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, 10h00
  4. Driver graphique de base
    Par pfeuh dans le forum C
    Réponses: 2
    Dernier message: 31/01/2007, 11h57
  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, 14h27

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