VirtualBox

Changeset 81081 in vbox for trunk/src/VBox/Additions/WINNT


Ignore:
Timestamp:
Sep 30, 2019 1:39:49 PM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
133686
Message:

WDDM: opengl test application: DrawArraysInstanced.

Location:
trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/gallium/ogltest
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/gallium/ogltest/Makefile.kmk

    r77646 r81081  
    2525
    2626ogltest_TEMPLATE = VBOXR3STATIC
     27ogltest_INCS = \
     28        $(PATH_ROOT)/src/VBox/Devices/Graphics/vmsvga_glext
    2729ogltest_SOURCES = \
    2830        ogltest.cpp \
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/gallium/ogltest/oglrender.cpp

    r79745 r81081  
    129129
    130130
     131/*
     132 * DrawArraysInstanced. Uses shaders from a guest.
     133 */
     134class OGLRenderDrawArrays : public OGLRender
     135{
     136    static const int cArrays = 4;
     137
     138    struct VertexAttribDesc
     139    {
     140        GLint     size;
     141        GLenum    type;
     142        GLboolean normalized;
     143        GLsizei   stride;
     144    };
     145
     146    static VertexAttribDesc aVertexAttribs[cArrays];
     147    GLuint vbNames[cArrays];
     148
     149    GLuint vertexShader;
     150    GLuint fragmentShader;
     151    GLuint program;
     152
     153    virtual HRESULT InitRender();
     154    virtual HRESULT DoRender();
     155};
     156
     157static const GLchar *apszVertexShader[] =
     158{
     159    "  #version 120\n"
     160    "  #extension GL_EXT_gpu_shader4 : enable\n"
     161    "  uniform vec4 VC[2048];\n"
     162    "  uniform vec4 posFixup;\n"
     163    "  void order_ps_input(in vec4[12]);\n"
     164    "  vec4 OUT[12];\n"
     165    "  vec4 R0;\n"
     166    "  vec4 R1;\n"
     167    "  vec4 R2;\n"
     168    "  attribute vec4 attrib0;\n"
     169    "  attribute vec4 attrib1;\n"
     170    "  attribute vec4 attrib2;\n"
     171    "  attribute vec4 attrib3;\n"
     172    "  vec4 tmp0;\n"
     173    "  vec4 tmp1;\n"
     174    "  bool p0[4];\n"
     175    "  uniform vec4 VC1 = { 0.000000, 0.000000, 1.00000, 1.000000 };\n"
     176    "  uniform vec4 VLC2 = { 1.000000, -1.000000, 0.500000, 0.000000 };\n"
     177    "  const float FLT_MAX = 1e38;\n"
     178    "  void main() {"
     179    "      R0.xy = (attrib0.xy);\n"
     180    "      R0.yzw = (R0.yyy * attrib2.xyz);\n"
     181    "      R0.xyz = ((attrib1.xyz * R0.xxx) + R0.yzw);\n"
     182    "      R0.xyz = (R0.xyz + attrib3.xyz);\n"
     183    "      R1.xyzw = (R0.xzyz * VC1.zxwy); // (R0.xzyz * VC[1].zxwy);\n"
     184    "      R1.xy = (R1.yw + R1.xz);\n"
     185    "      R2.xy = (R1.xy * VLC2.xy);\n"
     186    "      R2.zw = (R0.zz * VLC2.zx);\n"
     187    "      OUT[1].xyw = (R0.xyz);\n"
     188    "      OUT[1].z = (VLC2.w);\n"
     189    "      OUT[0].xyzw = (R2.xyzw);\n"
     190    "      gl_Position.xyzw = OUT[0].xyzw;\n"
     191    "      gl_FogFragCoord = 0.0;\n"
     192    "      //gl_Position.y = gl_Position.y * posFixup.y;\n"
     193    "      //gl_Position.xy += posFixup.zw * gl_Position.ww;\n"
     194    "      //gl_Position.z = gl_Position.z * 2.0 - gl_Position.w;\n"
     195    "  }\n"
     196};
     197
     198static const char *passthrough_vshader[] =
     199{
     200    "  #version 120\n"
     201    "  vec4 R0;\n"
     202    "  attribute vec4 attrib0;\n"
     203    "  attribute vec4 attrib1;\n"
     204    "  attribute vec4 attrib2;\n"
     205    "  attribute vec4 attrib3;\n"
     206    "  void main(void)\n"
     207    "  {\n"
     208    "      R0   = attrib0;\n"
     209    "      R0.w = 1.0;\n"
     210    "      R0.z = 0.0;\n"
     211    "      gl_Position   = R0;\n"
     212    "  }\n"
     213};
     214
     215static const GLchar *apszFragmentShader[] =
     216{
     217    "  #version 120\n"
     218    "  #extension GL_EXT_gpu_shader4 : enable\n"
     219    "  uniform vec4 PC[2048];\n"
     220    "  varying vec4 IN[31];\n"
     221    "  vec4 tmp0;\n"
     222    "  vec4 tmp1;\n"
     223    "  bool p0[4];\n"
     224    "  uniform vec4 PLC0;\n"
     225    "  const float FLT_MAX = 1e38;\n"
     226    "  void main() {"
     227    "      gl_FragData[0].xyzw = vec4(1.0, 1.0, 1.0, 1.0); //(PLC0.xyzw);\n"
     228    "  }\n"
     229};
     230
     231/* static */ OGLRenderDrawArrays::VertexAttribDesc OGLRenderDrawArrays::aVertexAttribs[OGLRenderDrawArrays::cArrays] =
     232{
     233    {2, GL_FLOAT, GL_FALSE, 8 },
     234    {4, GL_FLOAT, GL_FALSE, 0 },
     235    {4, GL_FLOAT, GL_FALSE, 0 },
     236    {4, GL_FLOAT, GL_FALSE, 0 }
     237};
     238
     239/* Triangle fan. */
     240static float aAttrib0[] =
     241{
     242    0.0f,  200.0f,
     243  300.0f,  200.0f,
     244  300.0f,  400.0f,
     245    0.0f,  400.0f
     246};
     247
     248static float aAttrib0a[] =
     249{
     250  -1.0f,  -1.0f,
     251   1.0f,  -1.0f,
     252   0.0f,   0.0f,
     253   0.0f,   2.0f
     254};
     255
     256static float aAttrib1[] =
     257{
     258    // 1 / (w / 2)
     259    0.001556f, 0.000000f, 0.000000f, 1.000000f,
     260};
     261
     262static float aAttrib2[] =
     263{
     264               // 1/ (h / 2)
     265    0.000000f, -0.001874f, 0.000000f, 1.000000f,
     266};
     267
     268static float aAttrib3[] =
     269{
     270    -1.000000f,  1.000000f, 1.000000f, 1.000000f,
     271};
     272
     273HRESULT OGLRenderDrawArrays::InitRender()
     274{
     275    glClearColor(0.0, 0.0, 1.0, 1.0);
     276
     277    int success;
     278    char szInfoLog[1024];
     279
     280    vertexShader = glCreateShader(GL_VERTEX_SHADER);
     281    GL_CHECK_ERROR();
     282    glShaderSource(vertexShader, 1, apszVertexShader, NULL);
     283    GL_CHECK_ERROR();
     284    glCompileShader(vertexShader);
     285    GL_CHECK_ERROR();
     286    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
     287    GL_CHECK_ERROR();
     288    if (!success)
     289    {
     290        glGetShaderInfoLog(vertexShader, sizeof(szInfoLog), NULL, szInfoLog);
     291        GL_CHECK_ERROR();
     292        TestShowError(E_FAIL, szInfoLog);
     293    };
     294
     295    fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
     296    GL_CHECK_ERROR();
     297    glShaderSource(fragmentShader, 1, apszFragmentShader, NULL);
     298    GL_CHECK_ERROR();
     299    glCompileShader(fragmentShader);
     300    GL_CHECK_ERROR();
     301    glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
     302    GL_CHECK_ERROR();
     303    if (!success)
     304    {
     305        glGetShaderInfoLog(fragmentShader, sizeof(szInfoLog), NULL, szInfoLog);
     306        GL_CHECK_ERROR();
     307        TestShowError(E_FAIL, szInfoLog);
     308    };
     309
     310    program = glCreateProgram();
     311    GL_CHECK_ERROR();
     312    glAttachShader(program, vertexShader);
     313    GL_CHECK_ERROR();
     314    glAttachShader(program, fragmentShader);
     315    GL_CHECK_ERROR();
     316    glLinkProgram(program);
     317    GL_CHECK_ERROR();
     318    glGetProgramiv(program, GL_LINK_STATUS, &success);
     319    if(!success)
     320    {
     321        glGetProgramInfoLog(program, sizeof(szInfoLog), NULL, szInfoLog);
     322        GL_CHECK_ERROR();
     323        TestShowError(E_FAIL, szInfoLog);
     324    }
     325
     326    glUseProgram(program);
     327    GL_CHECK_ERROR();
     328
     329    glGenBuffers(cArrays, vbNames);
     330    GL_CHECK_ERROR();
     331
     332    struct AttribData
     333    {
     334        GLsizeiptr size;
     335        const GLvoid * data;
     336    };
     337
     338    static struct AttribData attribData[cArrays] =
     339    {
     340        { sizeof(aAttrib0), aAttrib0 },
     341        { sizeof(aAttrib1), aAttrib1 },
     342        { sizeof(aAttrib2), aAttrib2 },
     343        { sizeof(aAttrib3), aAttrib3 },
     344    };
     345
     346    GLuint index;
     347    for (index = 0; index < cArrays; ++index)
     348    {
     349        glBindBuffer(GL_ARRAY_BUFFER, vbNames[index]);
     350        GL_CHECK_ERROR();
     351
     352        glBufferData(GL_ARRAY_BUFFER, attribData[index].size, attribData[index].data, GL_DYNAMIC_DRAW);
     353        GL_CHECK_ERROR();
     354
     355        glEnableVertexAttribArray(index);
     356        GL_CHECK_ERROR();
     357        glVertexAttribPointer(index, aVertexAttribs[index].size, aVertexAttribs[index].type,
     358                              aVertexAttribs[index].normalized, aVertexAttribs[index].stride,
     359                              (const GLvoid *)(uintptr_t)0);
     360        GL_CHECK_ERROR();
     361
     362        GLuint const divisor = aVertexAttribs[index].stride ?
     363                               0 : /* Once per vertex. */
     364                               1;  /* Once for one (1) set of vertices (or instance). */
     365        glVertexAttribDivisor(index, divisor);
     366        GL_CHECK_ERROR();
     367    }
     368
     369    glBindBuffer(GL_ARRAY_BUFFER, 0);
     370    GL_CHECK_ERROR();
     371
     372    return S_OK;
     373}
     374
     375HRESULT OGLRenderDrawArrays::DoRender()
     376{
     377    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
     378
     379    glDrawArraysInstanced(GL_TRIANGLE_FAN, 0, 4, 1);
     380    GL_CHECK_ERROR();
     381
     382    glFlush();
     383    return S_OK;
     384}
     385
     386
    131387OGLRender *CreateRender(int iRenderId)
    132388{
     
    136392        case 0: pRender = new OGLRenderTriangle(); break;
    137393        case 1: pRender = new OGLRenderTexture2D(); break;
     394        case 2: pRender = new OGLRenderDrawArrays(); break;
    138395        default:
    139396            break;
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/gallium/ogltest/oglrender.h

    r77646 r81081  
    2929#include <GL/gl.h>
    3030#include <GL/glu.h>
     31#include <glext.h>
    3132
    3233inline void TestShowError(HRESULT hr, const char *pszString)
     
    3536    MessageBoxA(0, pszString, 0, 0);
    3637}
     38/* Expand __LINE__ number to a string. */
     39#define OGLTEST_S(n) #n
     40#define OGLTEST_N2S(n) OGLTEST_S(n)
     41
     42#define GL_CHECK_ERROR() do { if (glGetError() != GL_NO_ERROR) TestShowError((E_FAIL), __FILE__ "@" OGLTEST_N2S(__LINE__)); } while(0)
    3743
    3844class OGLRender
     
    4955void DeleteRender(OGLRender *pRender);
    5056
     57extern PFNGLBINDBUFFERPROC                             glBindBuffer;
     58extern PFNGLDELETEBUFFERSPROC                          glDeleteBuffers;
     59extern PFNGLGENBUFFERSPROC                             glGenBuffers;
     60extern PFNGLBUFFERDATAPROC                             glBufferData;
     61extern PFNGLMAPBUFFERPROC                              glMapBuffer;
     62extern PFNGLUNMAPBUFFERPROC                            glUnmapBuffer;
     63extern PFNGLENABLEVERTEXATTRIBARRAYPROC                glEnableVertexAttribArray;
     64extern PFNGLDISABLEVERTEXATTRIBARRAYPROC               glDisableVertexAttribArray;
     65extern PFNGLVERTEXATTRIBPOINTERPROC                    glVertexAttribPointer;
     66extern PFNGLCREATESHADERPROC                           glCreateShader;
     67extern PFNGLATTACHSHADERPROC                           glAttachShader;
     68extern PFNGLCOMPILESHADERPROC                          glCompileShader;
     69extern PFNGLCREATEPROGRAMPROC                          glCreateProgram;
     70extern PFNGLDELETEPROGRAMPROC                          glDeleteProgram;
     71extern PFNGLDELETESHADERPROC                           glDeleteShader;
     72extern PFNGLDETACHSHADERPROC                           glDetachShader;
     73extern PFNGLLINKPROGRAMPROC                            glLinkProgram;
     74extern PFNGLSHADERSOURCEPROC                           glShaderSource;
     75extern PFNGLUSEPROGRAMPROC                             glUseProgram;
     76extern PFNGLGETPROGRAMIVPROC                           glGetProgramiv;
     77extern PFNGLGETPROGRAMINFOLOGPROC                      glGetProgramInfoLog;
     78extern PFNGLGETSHADERIVPROC                            glGetShaderiv;
     79extern PFNGLGETSHADERINFOLOGPROC                       glGetShaderInfoLog;
     80extern PFNGLVERTEXATTRIBDIVISORPROC                    glVertexAttribDivisor;
     81extern PFNGLDRAWARRAYSINSTANCEDPROC                    glDrawArraysInstanced;
     82
    5183#endif /* !GA_INCLUDED_SRC_WINNT_Graphics_Video_disp_wddm_gallium_ogltest_oglrender_h */
  • trunk/src/VBox/Additions/WINNT/Graphics/Video/disp/wddm/gallium/ogltest/ogltest.cpp

    r77646 r81081  
    1717
    1818#include "oglrender.h"
     19
     20PFNGLBINDBUFFERPROC                             glBindBuffer;
     21PFNGLDELETEBUFFERSPROC                          glDeleteBuffers;
     22PFNGLGENBUFFERSPROC                             glGenBuffers;
     23PFNGLBUFFERDATAPROC                             glBufferData;
     24PFNGLMAPBUFFERPROC                              glMapBuffer;
     25PFNGLUNMAPBUFFERPROC                            glUnmapBuffer;
     26PFNGLENABLEVERTEXATTRIBARRAYPROC                glEnableVertexAttribArray;
     27PFNGLDISABLEVERTEXATTRIBARRAYPROC               glDisableVertexAttribArray;
     28PFNGLVERTEXATTRIBPOINTERPROC                    glVertexAttribPointer;
     29PFNGLCREATESHADERPROC                           glCreateShader;
     30PFNGLATTACHSHADERPROC                           glAttachShader;
     31PFNGLCOMPILESHADERPROC                          glCompileShader;
     32PFNGLCREATEPROGRAMPROC                          glCreateProgram;
     33PFNGLDELETEPROGRAMPROC                          glDeleteProgram;
     34PFNGLDELETESHADERPROC                           glDeleteShader;
     35PFNGLDETACHSHADERPROC                           glDetachShader;
     36PFNGLLINKPROGRAMPROC                            glLinkProgram;
     37PFNGLSHADERSOURCEPROC                           glShaderSource;
     38PFNGLUSEPROGRAMPROC                             glUseProgram;
     39PFNGLGETPROGRAMIVPROC                           glGetProgramiv;
     40PFNGLGETPROGRAMINFOLOGPROC                      glGetProgramInfoLog;
     41PFNGLGETSHADERIVPROC                            glGetShaderiv;
     42PFNGLGETSHADERINFOLOGPROC                       glGetShaderInfoLog;
     43PFNGLVERTEXATTRIBDIVISORPROC                    glVertexAttribDivisor;
     44PFNGLDRAWARRAYSINSTANCEDPROC                    glDrawArraysInstanced;
    1945
    2046class OGLTest
     
    168194            mhGLRC = wglCreateContext(hDC);
    169195            setCurrentGLCtx(mhGLRC);
     196
     197/* Get a function address, return VERR_NOT_IMPLEMENTED on failure. */
     198#define GLGETPROC_(ProcType, ProcName, NameSuffix) do { \
     199    ProcName = (ProcType)wglGetProcAddress(#ProcName NameSuffix); \
     200    if (!ProcName) { TestShowError(E_FAIL, #ProcName NameSuffix " missing"); } \
     201} while(0)
     202
     203            GLGETPROC_(PFNGLBINDBUFFERPROC                       , glBindBuffer, "");
     204            GLGETPROC_(PFNGLDELETEBUFFERSPROC                    , glDeleteBuffers, "");
     205            GLGETPROC_(PFNGLGENBUFFERSPROC                       , glGenBuffers, "");
     206            GLGETPROC_(PFNGLBUFFERDATAPROC                       , glBufferData, "");
     207            GLGETPROC_(PFNGLMAPBUFFERPROC                        , glMapBuffer, "");
     208            GLGETPROC_(PFNGLUNMAPBUFFERPROC                      , glUnmapBuffer, "");
     209            GLGETPROC_(PFNGLENABLEVERTEXATTRIBARRAYPROC          , glEnableVertexAttribArray, "");
     210            GLGETPROC_(PFNGLDISABLEVERTEXATTRIBARRAYPROC         , glDisableVertexAttribArray, "");
     211            GLGETPROC_(PFNGLVERTEXATTRIBPOINTERPROC              , glVertexAttribPointer, "");
     212            GLGETPROC_(PFNGLCREATESHADERPROC                     , glCreateShader, "");
     213            GLGETPROC_(PFNGLATTACHSHADERPROC                     , glAttachShader, "");
     214            GLGETPROC_(PFNGLCOMPILESHADERPROC                    , glCompileShader, "");
     215            GLGETPROC_(PFNGLCREATEPROGRAMPROC                    , glCreateProgram, "");
     216            GLGETPROC_(PFNGLDELETEPROGRAMPROC                    , glDeleteProgram, "");
     217            GLGETPROC_(PFNGLDELETESHADERPROC                     , glDeleteShader, "");
     218            GLGETPROC_(PFNGLDETACHSHADERPROC                     , glDetachShader, "");
     219            GLGETPROC_(PFNGLLINKPROGRAMPROC                      , glLinkProgram, "");
     220            GLGETPROC_(PFNGLSHADERSOURCEPROC                     , glShaderSource, "");
     221            GLGETPROC_(PFNGLUSEPROGRAMPROC                       , glUseProgram, "");
     222            GLGETPROC_(PFNGLGETPROGRAMIVPROC                     , glGetProgramiv, "");
     223            GLGETPROC_(PFNGLGETPROGRAMINFOLOGPROC                , glGetProgramInfoLog, "");
     224            GLGETPROC_(PFNGLGETSHADERIVPROC                      , glGetShaderiv, "");
     225            GLGETPROC_(PFNGLGETSHADERINFOLOGPROC                 , glGetShaderInfoLog, "");
     226            GLGETPROC_(PFNGLVERTEXATTRIBDIVISORPROC              , glVertexAttribDivisor, "");
     227            GLGETPROC_(PFNGLDRAWARRAYSINSTANCEDPROC              , glDrawArraysInstanced, "");
     228
     229#undef GLGETPROC_
     230
    170231        }
    171232        else
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette