Log in

View Full Version : D3d example


b2kguga
25th April 2017, 14:42
Hi Guys

someone have a example of a plugin for Vdub that uses DirectX (d3d9) ? Vdub has a internal example called "Vfinvert" but, i cannot make it work as a external plugin, neither can make it work on the other style (The one that uses FilterDefinition structures, runproc etc).

I saw that it seems to use accelRunProc member of the structure FilterDefinition but, i´m unable to make it work. How to use that member ?

The goal is try to make a direct manipulation of matrices using D3d9 to test for speed. I mean, i want to test to see if using D3d9 is faster the using the direct manipulation of pixels that can deal with those kind of transformation. Ex: changing image vertically, flipping etc.

shekh
25th April 2017, 15:53
What do you expect to see? Flipping is too simple: when performed on cpu its cost is memory bandwidth, when performed on d3d its cost is cpu->gpu upload + gpu->cpu download + whatever drivers put inbetween. Invert is simple too, so you can taste performance with it.

If you still want it, show your not working code (as zip archive or git link, whatever).

Maybe you missed some code like this:


if (sAPIVersion >= 15 && fa->mpVDXA)
pThis->StartAccel(fa->mpVDXA);
else
pThis->Start();

b2kguga
25th April 2017, 18:23
I doing the flip on ParamProc like this:

Proc ParamProc:
Arguments @FilterActivation, @FilterFunctions
Local @pxlSrc, @pxlDst
Uses ecx, edx


call GetPixMapLayoutWidth D@FilterActivation, FILTER_SRC | shr eax 1 | mov ebx eax
call GetPixMapLayoutHeight D@FilterActivation, FILTER_DST | shr eax 1
call Changelayout D@FilterActivation, ebx, eax, KPIXFORMAT_XRGB8888

EndP

Where
Proc GetPixMapLayoutWidth:
Arguments @pFilterActivation, @Flag

mov eax D@pFilterActivation
On eax = 0, ExitP
If D@Flag = FILTER_SRC
mov eax D$eax+FilterActivation.VFBitmap.srcDis
Else
mov eax D$eax+FilterActivation.VFBitmap.dstDis
End_If
mov eax D$eax+VDXFBitmap.mpPixmapLayoutDis
mov eax D$eax+VDXPixmapLayout.widthDis

EndP

Proc GetPixMapLayoutHeight:
Arguments @pFilterActivation, @Flag

mov eax D@pFilterActivation
On eax = 0, ExitP
If D@Flag = FILTER_SRC
mov eax D$eax+FilterActivation.VFBitmap.srcDis
Else
mov eax D$eax+FilterActivation.VFBitmap.dstDis
End_If
mov eax D$eax+VDXFBitmap.mpPixmapLayoutDis
mov eax D$eax+VDXPixmapLayout.heightDis

EndP

Proc Changelayout:
Arguments @FilterActivation, @Width, @Height, @Format

call GetPixMapLayoutFormat D@FilterActivation, FILTER_SRC
If eax <> D@Format;KPIXFORMAT_XRGB8888
mov eax FILTERPARAM_NOT_SUPPORTED
Else

call SetImageDepth D@FilterActivation, 0, FILTER_DST
call SetPixMapLayoutWidth D@FilterActivation, D@Width, FILTER_DST
call SetPixMapLayoutHeight D@FilterActivation, D@Height, FILTER_DST
call SetPixMapLayoutFormat D@FilterActivation, D@Format, FILTER_DST
call SetPixMapLayoutPitch D@FilterActivation, 0, FILTER_DST
call AlignTo4 D@FilterActivation, FILTER_DST
mov eax FILTERPARAM_SWAP_BUFFERS+FILTERPARAM_PURE_TRANSFORM+FILTERPARAM_SUPPORTS_ALTFORMATS
End_If

EndP

I created wrappers to make it easier to port in assembly language. The problem is that i was trying to analyse how to make it works on DX9 as in the invert example

But...the example on the source does not uses the FilterDefinition structure.

About...

if (sAPIVersion >= 15 && fa->mpVDXA)
pThis->StartAccel(fa->mpVDXA);
else
pThis->Start();

Indeed..I missed this structure. VDXFilterActivation seems to have a similar format as in FilterActivation structure.

One question...is it used the same way then ? I mean, it is used as a member on FilterDefinition at accelRunProc ? or it needs to be used elsewhere ?

For example...i need to setup FilterDefinition like this ?

[FilterDefinition:
FilterDefinition.next: D$ &NULL
FilterDefinition.prev: D$ &NULL
FilterDefinition.module: D$ &NULL
FilterDefinition.name: D$ Sz_PluginName
FilterDefinition.desc: D$ Sz_Description
FilterDefinition.maker: D$ Sz_Author
FilterDefinition.private_data: D$ &NULL
FilterDefinition.inst_data_size: D$ Size_Of_FilterData
FilterDefinition.initProc: D$ 0;InitProc ; Seems not used here
FilterDefinition.deinitProc: D$ 0;DeInitProc
FilterDefinition.runProc: D$ RunProc
FilterDefinition.paramProc: D$ ParamProc
FilterDefinition.ConfigProc: D$ ConfigProc
FilterDefinition.StringProc: D$ StringProc
FilterDefinition.StartProc: D$ StartProc
FilterDefinition.EndProc: D$ EndProc
FilterDefinition.script_obj: D$ VDXScriptObject
FilterDefinition.fssProc: D$ FssProc
FilterDefinition.stringProc2: D$ StringProc2
FilterDefinition.serializeProc: D$ &NULL
FilterDefinition.deserializeProc: D$ &NULL
FilterDefinition.copyProc: D$ &NULL
FilterDefinition.prefetchProc: D$ &NULL
FilterDefinition.copyProc2: D$ &NULL
FilterDefinition.prefetchProc2: D$ &NULL
FilterDefinition.eventProc: D$ &NULL
FilterDefinition.accelRunProc: D$ MyaccelRunProc ---< ???
FilterDefinition.mSourceCountLowMinus1: D$ &NULL
FilterDefinition.mSourceCountHighMinus1: D$ &NULL
FilterDefinition.mpStaticAboutProc: D$ &NULL
FilterDefinition.mpStaticConfigureProc: D$ &NULL]

or create another FilterDefinition structure as the format in VDXFilterDefinition to be passed onto VirtualdubFilterModuleInit2 ?

shekh
25th April 2017, 18:50
> the example on the source does not uses the FilterDefinition structure

But it is using VDXFrame wrapper which is using FilterDefinition, you just need to unroll it (look at VideoFilter.cpp and its FilterStart code)

> VDXFilterActivation seems to have a similar format as in FilterActivation

Not sure what is "FilterActivation". All filters deal with VDXFilterActivation. It is passed as argument to all filter functions.

Can't help with asm directly. Check list for things:

ParamProc must agree to work in kPixFormat_VDXA_RGB or kPixFormat_VDXA_YUV (you can see this in vfinvert sample)

StartProc is supposed to load shaders, textures or whatever you use

StopProc to delete shaders

accelRunProc to issue render commands

b2kguga
25th April 2017, 20:10
FilterActivation i´ve got from filter.h

typedef VDXFilterActivation FilterActivation;

But...now that you pointed out...I missed a few more members of the structure. The complete structure is as displayed in Vdvideofilt.h here

class VDXFilterActivation {
public:
const VDXFilterDefinition *filter; //
void *filter_data;
VDXFBitmap& dst;
VDXFBitmap& src;
VDXFBitmap *_reserved0;
VDXFBitmap *const last;
uint32 x1;
uint32 y1;
uint32 x2;
uint32 y2;

VDXFilterStateInfo *pfsi;
IVDXFilterPreview *ifp;
IVDXFilterPreview2 *ifp2; // (V11+)

uint32 mSourceFrameCount; // (V14+)
VDXFBitmap *const *mpSourceFrames; // (V14+)
VDXFBitmap *const *mpOutputFrames; // (V14+)

IVDXAContext *mpVDXA; // (V15+)

uint32 mSourceStreamCount; // (V16+)
VDXFBitmap *const *mpSourceStreams; // (V16+)
};


When i converted i missed ifp2, mSourcerFrameCount....mpVDXA etc :o:o

I probably converted from an old versipon of Vdub that had this structure displayed as:


class VDXFilterActivation {
public:
const VDXFilterDefinition *filter; //
void *filter_data;
VDXFBitmap& dst;
VDXFBitmap& src;
VDXFBitmap *_reserved0;
VDXFBitmap *const last;
uint32 x1;
uint32 y1;
uint32 x2;
uint32 y2;

VDXFilterStateInfo *pfsi;
IVDXFilterPreview *ifp;
IVDXFilterPreview2 *ifp2; // (V11+)

uint32 mSourceFrameCount; // (V14+)
VDXFBitmap *const *mpSourceFrames; // (V14+)
VDXFBitmap *const *mpOutputFrames; // (V14+)
};


Not sure where i´ve got this structure definition, but thanks for explaining. I´ll update it right now :):):)

I´ll start reading VDXFrame wrapper to see if i can understand better the functionality to port it to assembly.


About VDXVideoFilter. I presumed it is also a structure, but....how to access it ?

class VDXVideoFilter {
public:
VDXVideoFilter();
virtual ~VDXVideoFilter();

void SetHooks(VDXFilterActivation *fa, const VDXFilterFunctions *ff);

// linkage routines

virtual bool Init();
virtual uint32 GetParams()=0;
virtual void Start();
virtual void Run();
virtual void End();
virtual bool Configure(VDXHWND hwnd);
virtual void GetSettingString(char *buf, int maxlen);
virtual void GetScriptString(char *buf, int maxlen);
virtual int Serialize(char *buf, int maxbuf);
virtual int Deserialize(const char *buf, int maxbuf);
virtual sint64 Prefetch(sint64 frame);
virtual bool Prefetch2(sint64 frame, IVDXVideoPrefetcher *prefetcher);

virtual void StartAccel(IVDXAContext *vdxa);
virtual void RunAccel(IVDXAContext *vdxa);
virtual void StopAccel(IVDXAContext *vdxa);

virtual bool OnEvent(uint32 event, const void *eventData);
virtual bool OnInvalidateCaches();

static void __cdecl FilterDeinit (VDXFilterActivation *fa, const VDXFilterFunctions *ff);
static int __cdecl FilterRun (const VDXFilterActivation *fa, const VDXFilterFunctions *ff);
static long __cdecl FilterParam (VDXFilterActivation *fa, const VDXFilterFunctions *ff);
static int __cdecl FilterConfig (VDXFilterActivation *fa, const VDXFilterFunctions *ff, VDXHWND hWnd);
static int __cdecl FilterStart (VDXFilterActivation *fa, const VDXFilterFunctions *ff);
static int __cdecl FilterEnd (VDXFilterActivation *fa, const VDXFilterFunctions *ff);
static void __cdecl FilterString (const VDXFilterActivation *fa, const VDXFilterFunctions *ff, char *buf);
static bool __cdecl FilterScriptStr(VDXFilterActivation *fa, const VDXFilterFunctions *, char *, int);
static void __cdecl FilterString2 (const VDXFilterActivation *fa, const VDXFilterFunctions *ff, char *buf, int maxlen);
static int __cdecl FilterSerialize (VDXFilterActivation *fa, const VDXFilterFunctions *ff, char *buf, int maxbuf);
static void __cdecl FilterDeserialize (VDXFilterActivation *fa, const VDXFilterFunctions *ff, const char *buf, int maxbuf);
static sint64 __cdecl FilterPrefetch(const VDXFilterActivation *fa, const VDXFilterFunctions *ff, sint64 frame);
static bool __cdecl FilterPrefetch2(const VDXFilterActivation *fa, const VDXFilterFunctions *ff, sint64 frame, IVDXVideoPrefetcher *prefetcher);
static void __cdecl FilterAccelRun(const VDXFilterActivation *fa, const VDXFilterFunctions *ff);
static bool __cdecl FilterEvent(const VDXFilterActivation *fa, const VDXFilterFunctions *ff, uint32 event, const void *eventData);

static bool StaticAbout(VDXHWND parent);
static bool StaticConfigure(VDXHWND parent);

// member variables
VDXFilterActivation *fa;
const VDXFilterFunctions *ff;

static const VDXScriptFunctionDef sScriptMethods[];

enum InputCountDefaults {
kMinInputCount = 1,
kMaxInputCount = 1
};

static void SetAPIVersion(uint32 apiVersion);

protected:
void SafePrintf(char *buf, int maxbuf, const char *format, ...);

static uint32 sAPIVersion;
};

shekh
25th April 2017, 21:11
If you cannot read cpp just forget VDXVideoFilter, it gives little new info.
All you need to know you have already, you need to use VDXFilterActivation to access IVDXAContext