[vlc-devel] [PATCH] Direct3D shader support (HLSL)

Sasha Koruga skoruga at gmail.com
Sat Aug 14 20:57:34 CEST 2010


Hey JB,
Sorry for taking so long to respond (my last email was sent at 4am, so
I really needed to get some sleep). Thank you for helping out, Xxvcv.
^^

> diff --git a/modules/gui/qt4/menus.cpp b/modules/gui/qt4/menus.cpp
> index 3e682e0..2e173f1 100644
> --- a/modules/gui/qt4/menus.cpp
> +++ b/modules/gui/qt4/menus.cpp
>
> Should be in a separate patch, without tabs.

The GUI code is in menus.cpp, vout_wrapper.c, and direct3d.c. That is
how the original direct3d author also did his gui coding, so I am just
following his example. To my knowledge, there is no guide on how to
add to the VLC gui, so I did my best job of reading the code and
testing things out in order to figure it out. If I made any mistakes,
please let me know.
Did you want me to submit menus.cpp in a separate patch, even though
it's related to the gui code in vout_wrapper.c and direct3d.c?

> +#define SHADERFX_MODE_LONGTEXT N_( "Shader effect to use for video post-processing.")
>  #define D3D_HELP N_("Recommended video output for Windows Vista and later versions")
>
> Should those be comma separated or?

I don't understand what you mean. Comma separated how?

>     add_bool("direct3d-desktop", false, NULL, DESKTOP_TEXT, DESKTOP_LONGTEXT, true)
> +    add_string( "shader-effects", "Disabled", NULL, SHADERFX_MODE_TEXT, SHADERFX_MODE_LONGTEXT, true )
> Why "Disabled" instead of empty?

This is the first option that appears in multi-select shader menu, and
that sets its name to "Disabled"

>
> +char shaderCode[] = " \
> Can't this be separated in special files?
>
> -    if (Direct3DCreate(vd)) {
> +    if (Direct3DCreate(vd))
> +    {

I'm just changing it to adhere to VLC's coding convention guide:
http://wiki.videolan.org/Code_Conventions
That's also how I wrote my code in the file, so this makes it
consistent throughout the file.

> +    //load shader support
> +    for(int i = 43; i > 23; --i)
> +    {
> +        char buffer[3], filename[14];
> +        strcpy(filename, "D3dx9_");
>
> why not strncpy?

Will change (didn't know you guys used strncpy & strncat)


> -    d3dpp->BackBufferWidth        = __MAX(GetSystemMetrics(SM_CXVIRTUALSCREEN),
> +    d3dpp->BackBufferWidth        = __MAX((unsigned int)GetSystemMetrics(SM_CXVIRTUALSCREEN),
>                                           d3ddm.Width);
> -    d3dpp->BackBufferHeight       = __MAX(GetSystemMetrics(SM_CYVIRTUALSCREEN),
> +    d3dpp->BackBufferHeight       = __MAX((unsigned int)GetSystemMetrics(SM_CYVIRTUALSCREEN),
>                                           d3ddm.Height);
> Those 2 things should be in a separate patch

I'll make a separate patch for the warning suppressions.

>
>     // Create the D3DDevice
>     LPDIRECT3DDEVICE9 d3ddev;
> -    HRESULT hr = IDirect3D9_CreateDevice(d3dobj, D3DADAPTER_DEFAULT,
> -                                         D3DDEVTYPE_HAL, sys->hvideownd,
> +
> +    // Look for 'NVIDIA PerfHUD' adapter
> +    // If it is present, override default settings
> +    UINT AdapterToUse = D3DADAPTER_DEFAULT;
> +    D3DDEVTYPE DeviceType = D3DDEVTYPE_HAL;
> +    for (UINT Adapter=0; Adapter< IDirect3D9_GetAdapterCount(d3dobj); ++Adapter)
> +    {
> +        D3DADAPTER_IDENTIFIER9 Identifier;
> +        HRESULT Res;
> +        Res = IDirect3D9_GetAdapterIdentifier(d3dobj,Adapter,0,&Identifier);
> +        if (strstr(Identifier.Description,"PerfHUD") != 0)
> +        {
> +            AdapterToUse = Adapter;
> +            DeviceType = D3DDEVTYPE_REF;
> +            break;
> +        }
> +    }
> +
> +    HRESULT hr = IDirect3D9_CreateDevice(d3dobj, AdapterToUse,
> +                                         DeviceType, sys->hvideownd,
>                                          D3DCREATE_SOFTWARE_VERTEXPROCESSING|
>                                          D3DCREATE_MULTITHREADED,
>                                          &sys->d3dpp, &d3ddev);
>
> This should be also in a separate patch.

Will do.
>
> +    if(sys->hd3d9x_dll)
> +    {
> +        HRESULT (WINAPI * OurD3DXCreateEffect)(
> +            LPDIRECT3DDEVICE9               pDevice,
> +            LPCVOID                         pSrcData,
> +            UINT                            SrcDataLen,
> +            CONST D3DXMACRO*                pDefines,
> +            LPD3DXINCLUDE                   pInclude,
> +            DWORD                           Flags,
> +            LPD3DXEFFECTPOOL                pPool,
> +            LPD3DXEFFECT*                   ppEffect,
> +            LPD3DXBUFFER*                   ppCompilationErrors);
>
> Why declaring it here?

Why not? I use it only in this one function.
Would you prefer it be declared somewhere else?

>
> +        OurD3DXCreateEffect = (void*)GetProcAddress(sys->hd3d9x_dll, TEXT("D3DXCreateEffect"));
> +        if (!OurD3DXCreateEffect)
> +        {
> +            msg_Warn(vd, "Cannot locate reference to D3DXCreateEffect ABI in DLL; pixel shading will be disabled");
> +            sys->d3dxShader = NULL;
> +        }
> +        else
> +        {
> +            LPD3DXBUFFER buffer = NULL;
> +            DWORD dwShaderFlags = D3DXFX_NOT_CLONEABLE;
> +            HRESULT hr = OurD3DXCreateEffect(sys->d3ddev, shaderCode, strlen(shaderCode), NULL, NULL, dwShaderFlags, NULL, ((ID3DXEffect**)(&sys->d3dxShader)), &buffer);
> +            if (FAILED(hr))
> +            {
> +               msg_Warn(vd, "OurD3DXCreateEffect Error (hr=0x%lX) -- pixel shading will be disabled.", hr);
>
> %lX ? %li maybe is better

I just copied the method the original d3d author used to output HR
errors. Did you want me to change all of the HR output to %li?
I must admit, though, I think %lX is better. I think that's what's
generally used for HResult errors (when using Microsoft's HR lookup
tool, it defaults to hex).

>
> @@ -771,10 +1072,7 @@ static int Direct3DLockSurface(picture_t *picture)
>  static void Direct3DUnlockSurface(picture_t *picture)
>  {
>     /* Unlock the Surface */
> -    HRESULT hr = IDirect3DSurface9_UnlockRect(picture->p_sys->surface);
> -    if (FAILED(hr)) {
> -        //msg_Dbg(vd, "%s:%d (hr=0x%0lX)", __FUNCTION__, __LINE__, hr);
> -    }
> +    IDirect3DSurface9_UnlockRect(picture->p_sys->surface);
>  }
>
> No, this can be helpful for debugging the module.

How so? The debugging line was commented out (notice the "//" before
"msg_Dbg"). The function doesn't have access to the "vd" variable, so
it cannot output debugging information.


> Should all this code be in the wrapper?

The direct3d module has some of its GUI code in the wrapper, so I
believe so. I did try to have it in direct3d.c, but that did not work
for whatever reason. I assume the original d3d author ran into the
same issue, and thus why he also has GUI code in the wrapper.

>
> Be careful, trailing spaces and tabs here too

Will do.


Thank you for reviewing my code, JB.
Did you want me to submit a separate patch for the shader logic &
shader GUI? The problem is, without the GUI code to enable selection
of different shaders, you can't really test the shader code.

Best Regards,
Sasha



More information about the vlc-devel mailing list