Skip to content

Commit 6e77c70

Browse files
malayakusraman4
authored andcommitted
ZC v1918 : Added support for hardware cursor in DVServerUMD & DVServerKMD
Signed-off-by: Malaya Kumar Parida <malaya.kumar.parida@intel.com>
1 parent 6738cb0 commit 6e77c70

22 files changed

+585
-677
lines changed

DVServerKMD/DVServerKMD_Version.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,4 @@
88
; This file will have the DVServerKMD version
99
;--------------------------------------------------------------------------*/
1010

11-
DVServerKMD_Version = 4.0.0
11+
DVServerKMD_Version = 5.0.0

DVServerKMD/Public.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ DEFINE_GUID(GUID_DEVINTERFACE_DVServerKMD,
3232
#define IOCTL_DVSERVER_TEST_IMAGE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x812, METHOD_BUFFERED, FILE_ANY_ACCESS)
3333
#define IOCTL_DVSERVER_GET_TOTAL_SCREENS CTL_CODE(FILE_DEVICE_UNKNOWN, 0x813, METHOD_BUFFERED, FILE_ANY_ACCESS)
3434
#define IOCTL_DVSERVER_HP_EVENT CTL_CODE(FILE_DEVICE_UNKNOWN, 0x814, METHOD_BUFFERED, FILE_ANY_ACCESS)
35+
#define IOCTL_DVSERVER_CURSOR_POS CTL_CODE(FILE_DEVICE_UNKNOWN, 0x815, METHOD_BUFFERED, FILE_ANY_ACCESS)
3536

3637
typedef struct FrameMetaData
3738
{
@@ -49,15 +50,19 @@ typedef struct FrameMetaData
4950

5051
typedef struct CursorData
5152
{
53+
UINT32 screen_num;
5254
INT cursor_x;
5355
INT cursor_y;
54-
UINT16 iscursorvisible;
56+
bool iscursorvisible;
5557
UINT32 cursor_version;
5658
UINT16 cursor_type;
5759
UINT32 width;
5860
UINT32 height;
5961
UINT32 pitch;
60-
void* data;
62+
UINT32 color_format;
63+
void* data;
64+
UINT32 x_hot;
65+
UINT32 y_hot;
6166
}CursorData;
6267

6368
struct mode_info

DVServerKMD/Queue.cpp

Lines changed: 118 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,6 @@ Return Value:
127127
{
128128
NTSTATUS status = STATUS_SUCCESS;
129129
size_t bufSize;
130-
struct CursorData* cptr = NULL;
131130
struct KMDF_IOCTL_Response* resp = NULL;
132131
WDFDEVICE Device = WdfIoQueueGetDevice(Queue);
133132
PDEVICE_CONTEXT pDeviceContext = DeviceGetContext(Device);
@@ -169,14 +168,32 @@ Return Value:
169168

170169

171170
case IOCTL_DVSERVER_CURSOR_DATA:
172-
status = WdfRequestRetrieveInputBuffer(Request, 0, (PVOID*)&cptr, &bufSize);
171+
172+
status = IoctlSetPointerShape(pDeviceContext, InputBufferLength, Request);
173+
if (status != STATUS_SUCCESS) {
174+
ERR("IoctlSetPointerShape failed with status = %d\n", status);
175+
return;
176+
}
177+
178+
status = WdfRequestRetrieveOutputBuffer(Request, 0, (PVOID*)&resp, &bufSize);
173179
if (!NT_SUCCESS(status)) {
174-
ERR("Couldn't retrieve Input buffer\n");
180+
ERR("Couldn't retrieve Output buffer\n");
175181
WdfRequestComplete(Request, STATUS_INSUFFICIENT_RESOURCES);
176182
return;
177183
}
178184

179-
PRINT_CURSOR_DATA(("x=%d, y=%d", cptr->cursor_x, cptr->cursor_y));
185+
//Return value from the KMDF DVServer
186+
resp->retval = DVSERVERKMD_SUCCESS;
187+
WdfRequestSetInformation(Request, sizeof(struct KMDF_IOCTL_Response));
188+
break;
189+
190+
case IOCTL_DVSERVER_CURSOR_POS:
191+
status = IoctlSetPointerPosition(pDeviceContext, InputBufferLength, Request);
192+
if (status != STATUS_SUCCESS) {
193+
ERR("IoctlSetPointerPosition failed with status = %d\n", status);
194+
WdfRequestComplete(Request, STATUS_INSUFFICIENT_RESOURCES);
195+
return;
196+
}
180197

181198
status = WdfRequestRetrieveOutputBuffer(Request, 0, (PVOID*)&resp, &bufSize);
182199
if (!NT_SUCCESS(status)) {
@@ -589,4 +606,100 @@ static NTSTATUS IoctlRequestHPEventInfo(
589606
WdfRequestSetInformation(Request, sizeof(struct hp_info));
590607

591608
return STATUS_SUCCESS;
592-
}
609+
}
610+
611+
static NTSTATUS IoctlSetPointerShape(
612+
const PDEVICE_CONTEXT DeviceContext,
613+
const size_t InputBufferLength,
614+
const WDFREQUEST Request)
615+
{
616+
POINTER_SHAPE pointerShape;
617+
struct CursorData* cptr = NULL;
618+
size_t bufSize;
619+
NTSTATUS status = STATUS_UNSUCCESSFUL;
620+
621+
TRACING();
622+
623+
VioGpuAdapterLite* pAdapter =
624+
(VioGpuAdapterLite*)(DeviceContext ? DeviceContext->pvDeviceExtension : nullptr);
625+
626+
if (!pAdapter) {
627+
ERR("Couldnt' find adapter\n");
628+
return status;
629+
}
630+
631+
status = WdfRequestRetrieveInputBuffer(Request, InputBufferLength, (PVOID*)&cptr, &bufSize);
632+
if (!NT_SUCCESS(status)) {
633+
ERR("Couldn't retrieve Input buffer\n");
634+
WdfRequestComplete(Request, STATUS_INSUFFICIENT_RESOURCES);
635+
return STATUS_INVALID_USER_BUFFER;
636+
}
637+
638+
if (cptr == NULL) {
639+
return STATUS_UNSUCCESSFUL;
640+
}
641+
642+
RtlZeroMemory(&pointerShape, sizeof(POINTER_SHAPE));
643+
pointerShape.pointer.VidPnSourceId = cptr->screen_num;
644+
pointerShape.pointer.Height = cptr->height;
645+
pointerShape.pointer.Width = cptr->width;
646+
pointerShape.pointer.Pitch = cptr->pitch;
647+
pointerShape.pointer.pPixels = cptr->data;
648+
pointerShape.pointer.XHot = cptr->x_hot;
649+
pointerShape.pointer.YHot = cptr->y_hot;
650+
pointerShape.X = cptr->cursor_x;
651+
pointerShape.Y = cptr->cursor_y;
652+
653+
status = pAdapter->SetPointerShape(&pointerShape, cptr->color_format, cptr->iscursorvisible);
654+
655+
if (status != STATUS_SUCCESS) {
656+
ERR("SetPointerShape failed with status = %d\n", status);
657+
return STATUS_UNSUCCESSFUL;
658+
}
659+
return STATUS_SUCCESS;
660+
}
661+
662+
static NTSTATUS IoctlSetPointerPosition(
663+
const PDEVICE_CONTEXT DeviceContext,
664+
const size_t InputBufferLength,
665+
const WDFREQUEST Request)
666+
{
667+
DXGKARG_SETPOINTERPOSITION pointerPosition;
668+
struct CursorData* cptr = NULL;
669+
size_t bufSize;
670+
NTSTATUS status = STATUS_UNSUCCESSFUL;
671+
672+
TRACING();
673+
674+
VioGpuAdapterLite* pAdapter =
675+
(VioGpuAdapterLite*)(DeviceContext ? DeviceContext->pvDeviceExtension : 0);
676+
677+
if (!pAdapter) {
678+
ERR("Couldnt' find adapter\n");
679+
return status;
680+
}
681+
682+
status = WdfRequestRetrieveInputBuffer(Request, InputBufferLength, (PVOID*)&cptr, &bufSize);
683+
if (!NT_SUCCESS(status)) {
684+
ERR("Couldn't retrieve Input buffer\n");
685+
WdfRequestComplete(Request, STATUS_INSUFFICIENT_RESOURCES);
686+
return STATUS_INVALID_USER_BUFFER;
687+
}
688+
689+
if (cptr == NULL) {
690+
return STATUS_UNSUCCESSFUL;
691+
}
692+
693+
RtlZeroMemory(&pointerPosition, sizeof(DXGKARG_SETPOINTERPOSITION));
694+
pointerPosition.X = cptr->cursor_x;
695+
pointerPosition.Y = cptr->cursor_y;
696+
pointerPosition.VidPnSourceId = cptr->screen_num;
697+
698+
status = pAdapter->SetPointerPosition(&pointerPosition);
699+
700+
if (status != STATUS_SUCCESS) {
701+
ERR("SetPointerPosition failed with status = %d\n", status);
702+
return STATUS_UNSUCCESSFUL;
703+
}
704+
return STATUS_SUCCESS;
705+
}

DVServerKMD/Queue.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,16 @@ static NTSTATUS IoctlRequestHPEventInfo(
6868
const WDFREQUEST Request,
6969
size_t* BytesReturned);
7070

71+
static NTSTATUS IoctlSetPointerShape(
72+
const PDEVICE_CONTEXT DeviceContext,
73+
const size_t InputBufferLength,
74+
const WDFREQUEST Request);
75+
76+
static NTSTATUS IoctlSetPointerPosition(
77+
const PDEVICE_CONTEXT DeviceContext,
78+
const size_t InputBufferLength,
79+
const WDFREQUEST Request);
80+
7181
//
7282
// Events from the IoQueue object
7383
//

DVServerKMD/bitops.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,13 @@ VOID CopyBits32_32(
162162

163163
for (UINT i = 0; i < NumRows; ++i) {
164164
RtlCopyMemory(pStartDst, pStartSrc, BytesToCopy);
165+
for (UINT j = 0; j < NumPixels; j++) {
166+
RtlCopyMemory(&pStartDst[j * 4], &pStartSrc[j * 4], 4);
167+
if (pDst->PixelFmt == D3DDDIFMT_A8B8G8R8 && pSrc->PixelFmt == D3DDDIFMT_A8R8G8B8) {
168+
pStartDst[j * 4] = pStartSrc[j * 4 + 2];
169+
pStartDst[j * 4 + 2] = pStartSrc[j * 4];
170+
}
171+
}
165172
pStartDst += pDst->Pitch;
166173
pStartSrc += pSrc->Pitch;
167174
}
@@ -203,6 +210,7 @@ UINT BPPFromPixelFormat(D3DDDIFORMAT Format)
203210
case D3DDDIFMT_R5G6B5: return 16;
204211
case D3DDDIFMT_R8G8B8: return 24;
205212
case D3DDDIFMT_X8R8G8B8:
213+
case D3DDDIFMT_A8B8G8R8:
206214
case D3DDDIFMT_A8R8G8B8: return 32;
207215
default: VIOGPU_LOG_ASSERTION1("Unknown D3DDDIFORMAT 0x%I64x", Format); return 0;
208216
}

DVServerKMD/bitops.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ typedef struct _BLT_INFO {
99
D3DKMDT_VIDPN_PRESENT_PATH_ROTATION Rotation;
1010
UINT Width;
1111
UINT Height;
12+
D3DDDIFORMAT PixelFmt;
1213
} BLT_INFO;
1314

1415

0 commit comments

Comments
 (0)