1*03ce13f7SAndroid Build Coastguard Worker // Copyright 2020 The SwiftShader Authors. All Rights Reserved.
2*03ce13f7SAndroid Build Coastguard Worker //
3*03ce13f7SAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*03ce13f7SAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*03ce13f7SAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*03ce13f7SAndroid Build Coastguard Worker //
7*03ce13f7SAndroid Build Coastguard Worker // http://www.apache.org/licenses/LICENSE-2.0
8*03ce13f7SAndroid Build Coastguard Worker //
9*03ce13f7SAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*03ce13f7SAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*03ce13f7SAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*03ce13f7SAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*03ce13f7SAndroid Build Coastguard Worker // limitations under the License.
14*03ce13f7SAndroid Build Coastguard Worker
15*03ce13f7SAndroid Build Coastguard Worker #include "DisplaySurfaceKHR.hpp"
16*03ce13f7SAndroid Build Coastguard Worker
17*03ce13f7SAndroid Build Coastguard Worker #include "Vulkan/VkDeviceMemory.hpp"
18*03ce13f7SAndroid Build Coastguard Worker #include "Vulkan/VkImage.hpp"
19*03ce13f7SAndroid Build Coastguard Worker
20*03ce13f7SAndroid Build Coastguard Worker #include <dirent.h>
21*03ce13f7SAndroid Build Coastguard Worker #include <fcntl.h>
22*03ce13f7SAndroid Build Coastguard Worker #include <string.h>
23*03ce13f7SAndroid Build Coastguard Worker #include <sys/mman.h>
24*03ce13f7SAndroid Build Coastguard Worker #include <unistd.h>
25*03ce13f7SAndroid Build Coastguard Worker #include <xf86drm.h>
26*03ce13f7SAndroid Build Coastguard Worker
27*03ce13f7SAndroid Build Coastguard Worker namespace vk {
28*03ce13f7SAndroid Build Coastguard Worker
openCard()29*03ce13f7SAndroid Build Coastguard Worker static int openCard()
30*03ce13f7SAndroid Build Coastguard Worker {
31*03ce13f7SAndroid Build Coastguard Worker constexpr size_t DIR_NAME_MAX = sizeof("/dev/dri/") - 1;
32*03ce13f7SAndroid Build Coastguard Worker constexpr size_t PRE_NODE_NAME_MAX = sizeof("card") - 1;
33*03ce13f7SAndroid Build Coastguard Worker constexpr size_t POST_NODE_NAME_MAX = sizeof("255") - 1;
34*03ce13f7SAndroid Build Coastguard Worker constexpr size_t NODE_NAME_MAX =
35*03ce13f7SAndroid Build Coastguard Worker DIR_NAME_MAX + PRE_NODE_NAME_MAX + POST_NODE_NAME_MAX;
36*03ce13f7SAndroid Build Coastguard Worker char name[NODE_NAME_MAX] = "/dev/dri/";
37*03ce13f7SAndroid Build Coastguard Worker int fd = -VK_NOT_READY;
38*03ce13f7SAndroid Build Coastguard Worker
39*03ce13f7SAndroid Build Coastguard Worker /*
40*03ce13f7SAndroid Build Coastguard Worker * Open the first DRM/KMS device. The libdrm drmOpen*() functions
41*03ce13f7SAndroid Build Coastguard Worker * from drmOpen() is of no practical use as any modern system will
42*03ce13f7SAndroid Build Coastguard Worker * handle that through udev or an equivalent component.
43*03ce13f7SAndroid Build Coastguard Worker */
44*03ce13f7SAndroid Build Coastguard Worker DIR *folder = opendir(name);
45*03ce13f7SAndroid Build Coastguard Worker if(!folder)
46*03ce13f7SAndroid Build Coastguard Worker {
47*03ce13f7SAndroid Build Coastguard Worker return -errno;
48*03ce13f7SAndroid Build Coastguard Worker }
49*03ce13f7SAndroid Build Coastguard Worker
50*03ce13f7SAndroid Build Coastguard Worker strncat(name, "card", 5);
51*03ce13f7SAndroid Build Coastguard Worker for(struct dirent *res; (res = readdir(folder));)
52*03ce13f7SAndroid Build Coastguard Worker {
53*03ce13f7SAndroid Build Coastguard Worker if(!strncmp(res->d_name, "card", 4))
54*03ce13f7SAndroid Build Coastguard Worker {
55*03ce13f7SAndroid Build Coastguard Worker strncat(name, res->d_name + PRE_NODE_NAME_MAX, 4);
56*03ce13f7SAndroid Build Coastguard Worker fd = open(name, O_RDWR);
57*03ce13f7SAndroid Build Coastguard Worker if(fd >= 0)
58*03ce13f7SAndroid Build Coastguard Worker {
59*03ce13f7SAndroid Build Coastguard Worker break;
60*03ce13f7SAndroid Build Coastguard Worker }
61*03ce13f7SAndroid Build Coastguard Worker
62*03ce13f7SAndroid Build Coastguard Worker name[DIR_NAME_MAX + PRE_NODE_NAME_MAX] = 0;
63*03ce13f7SAndroid Build Coastguard Worker fd = -errno;
64*03ce13f7SAndroid Build Coastguard Worker }
65*03ce13f7SAndroid Build Coastguard Worker }
66*03ce13f7SAndroid Build Coastguard Worker
67*03ce13f7SAndroid Build Coastguard Worker closedir(folder);
68*03ce13f7SAndroid Build Coastguard Worker
69*03ce13f7SAndroid Build Coastguard Worker return fd;
70*03ce13f7SAndroid Build Coastguard Worker }
71*03ce13f7SAndroid Build Coastguard Worker
GetDisplayModeProperties(uint32_t * pPropertyCount,VkDisplayModePropertiesKHR * pProperties)72*03ce13f7SAndroid Build Coastguard Worker VkResult DisplaySurfaceKHR::GetDisplayModeProperties(uint32_t *pPropertyCount, VkDisplayModePropertiesKHR *pProperties)
73*03ce13f7SAndroid Build Coastguard Worker {
74*03ce13f7SAndroid Build Coastguard Worker *pPropertyCount = 1;
75*03ce13f7SAndroid Build Coastguard Worker
76*03ce13f7SAndroid Build Coastguard Worker if(pProperties)
77*03ce13f7SAndroid Build Coastguard Worker {
78*03ce13f7SAndroid Build Coastguard Worker const int fd = openCard();
79*03ce13f7SAndroid Build Coastguard Worker if(fd < 0)
80*03ce13f7SAndroid Build Coastguard Worker {
81*03ce13f7SAndroid Build Coastguard Worker return VK_NOT_READY;
82*03ce13f7SAndroid Build Coastguard Worker }
83*03ce13f7SAndroid Build Coastguard Worker
84*03ce13f7SAndroid Build Coastguard Worker drmModeRes *res = drmModeGetResources(fd);
85*03ce13f7SAndroid Build Coastguard Worker drmModeConnector *connector = drmModeGetConnector(fd, res->connectors[0]);
86*03ce13f7SAndroid Build Coastguard Worker pProperties->displayMode = (uintptr_t)connector->modes[0].name;
87*03ce13f7SAndroid Build Coastguard Worker pProperties->parameters.visibleRegion.width = connector->modes[0].hdisplay;
88*03ce13f7SAndroid Build Coastguard Worker pProperties->parameters.visibleRegion.height = connector->modes[0].vdisplay;
89*03ce13f7SAndroid Build Coastguard Worker pProperties->parameters.refreshRate = connector->modes[0].vrefresh * 1000;
90*03ce13f7SAndroid Build Coastguard Worker drmModeFreeConnector(connector);
91*03ce13f7SAndroid Build Coastguard Worker drmModeFreeResources(res);
92*03ce13f7SAndroid Build Coastguard Worker close(fd);
93*03ce13f7SAndroid Build Coastguard Worker }
94*03ce13f7SAndroid Build Coastguard Worker
95*03ce13f7SAndroid Build Coastguard Worker return VK_SUCCESS;
96*03ce13f7SAndroid Build Coastguard Worker }
97*03ce13f7SAndroid Build Coastguard Worker
GetDisplayPlaneCapabilities(VkDisplayPlaneCapabilitiesKHR * pCapabilities)98*03ce13f7SAndroid Build Coastguard Worker VkResult DisplaySurfaceKHR::GetDisplayPlaneCapabilities(VkDisplayPlaneCapabilitiesKHR *pCapabilities)
99*03ce13f7SAndroid Build Coastguard Worker {
100*03ce13f7SAndroid Build Coastguard Worker const int fd = openCard();
101*03ce13f7SAndroid Build Coastguard Worker if(fd < 0)
102*03ce13f7SAndroid Build Coastguard Worker {
103*03ce13f7SAndroid Build Coastguard Worker return VK_NOT_READY;
104*03ce13f7SAndroid Build Coastguard Worker }
105*03ce13f7SAndroid Build Coastguard Worker
106*03ce13f7SAndroid Build Coastguard Worker drmModeRes *res = drmModeGetResources(fd);
107*03ce13f7SAndroid Build Coastguard Worker drmModeConnector *connector = drmModeGetConnector(fd, res->connectors[0]);
108*03ce13f7SAndroid Build Coastguard Worker pCapabilities->supportedAlpha = VK_DISPLAY_PLANE_ALPHA_OPAQUE_BIT_KHR;
109*03ce13f7SAndroid Build Coastguard Worker pCapabilities->minSrcPosition.x = 0;
110*03ce13f7SAndroid Build Coastguard Worker pCapabilities->minSrcPosition.y = 0;
111*03ce13f7SAndroid Build Coastguard Worker pCapabilities->maxSrcPosition.x = 0;
112*03ce13f7SAndroid Build Coastguard Worker pCapabilities->maxSrcPosition.y = 0;
113*03ce13f7SAndroid Build Coastguard Worker pCapabilities->minSrcExtent.width = connector->modes[0].hdisplay;
114*03ce13f7SAndroid Build Coastguard Worker pCapabilities->minSrcExtent.height = connector->modes[0].vdisplay;
115*03ce13f7SAndroid Build Coastguard Worker pCapabilities->maxSrcExtent.width = connector->modes[0].hdisplay;
116*03ce13f7SAndroid Build Coastguard Worker pCapabilities->maxSrcExtent.height = connector->modes[0].vdisplay;
117*03ce13f7SAndroid Build Coastguard Worker pCapabilities->minDstPosition.x = 0;
118*03ce13f7SAndroid Build Coastguard Worker pCapabilities->minDstPosition.y = 0;
119*03ce13f7SAndroid Build Coastguard Worker pCapabilities->maxDstPosition.x = 0;
120*03ce13f7SAndroid Build Coastguard Worker pCapabilities->maxDstPosition.y = 0;
121*03ce13f7SAndroid Build Coastguard Worker pCapabilities->minDstExtent.width = connector->modes[0].hdisplay;
122*03ce13f7SAndroid Build Coastguard Worker pCapabilities->minDstExtent.height = connector->modes[0].vdisplay;
123*03ce13f7SAndroid Build Coastguard Worker pCapabilities->maxDstExtent.width = connector->modes[0].hdisplay;
124*03ce13f7SAndroid Build Coastguard Worker pCapabilities->maxDstExtent.height = connector->modes[0].vdisplay;
125*03ce13f7SAndroid Build Coastguard Worker drmModeFreeConnector(connector);
126*03ce13f7SAndroid Build Coastguard Worker drmModeFreeResources(res);
127*03ce13f7SAndroid Build Coastguard Worker close(fd);
128*03ce13f7SAndroid Build Coastguard Worker
129*03ce13f7SAndroid Build Coastguard Worker return VK_SUCCESS;
130*03ce13f7SAndroid Build Coastguard Worker }
131*03ce13f7SAndroid Build Coastguard Worker
GetDisplayPlaneSupportedDisplays(uint32_t * pDisplayCount,VkDisplayKHR * pDisplays)132*03ce13f7SAndroid Build Coastguard Worker VkResult DisplaySurfaceKHR::GetDisplayPlaneSupportedDisplays(uint32_t *pDisplayCount, VkDisplayKHR *pDisplays)
133*03ce13f7SAndroid Build Coastguard Worker {
134*03ce13f7SAndroid Build Coastguard Worker *pDisplayCount = 1;
135*03ce13f7SAndroid Build Coastguard Worker
136*03ce13f7SAndroid Build Coastguard Worker if(pDisplays)
137*03ce13f7SAndroid Build Coastguard Worker {
138*03ce13f7SAndroid Build Coastguard Worker const int fd = openCard();
139*03ce13f7SAndroid Build Coastguard Worker if(fd < 0)
140*03ce13f7SAndroid Build Coastguard Worker {
141*03ce13f7SAndroid Build Coastguard Worker return VK_NOT_READY;
142*03ce13f7SAndroid Build Coastguard Worker }
143*03ce13f7SAndroid Build Coastguard Worker
144*03ce13f7SAndroid Build Coastguard Worker drmModeRes *res = drmModeGetResources(fd);
145*03ce13f7SAndroid Build Coastguard Worker *pDisplays = res->connectors[0];
146*03ce13f7SAndroid Build Coastguard Worker drmModeFreeResources(res);
147*03ce13f7SAndroid Build Coastguard Worker close(fd);
148*03ce13f7SAndroid Build Coastguard Worker }
149*03ce13f7SAndroid Build Coastguard Worker
150*03ce13f7SAndroid Build Coastguard Worker return VK_SUCCESS;
151*03ce13f7SAndroid Build Coastguard Worker }
152*03ce13f7SAndroid Build Coastguard Worker
GetPhysicalDeviceDisplayPlaneProperties(uint32_t * pPropertyCount,VkDisplayPlanePropertiesKHR * pProperties)153*03ce13f7SAndroid Build Coastguard Worker VkResult DisplaySurfaceKHR::GetPhysicalDeviceDisplayPlaneProperties(uint32_t *pPropertyCount, VkDisplayPlanePropertiesKHR *pProperties)
154*03ce13f7SAndroid Build Coastguard Worker {
155*03ce13f7SAndroid Build Coastguard Worker *pPropertyCount = 1;
156*03ce13f7SAndroid Build Coastguard Worker
157*03ce13f7SAndroid Build Coastguard Worker if(pProperties)
158*03ce13f7SAndroid Build Coastguard Worker {
159*03ce13f7SAndroid Build Coastguard Worker const int fd = openCard();
160*03ce13f7SAndroid Build Coastguard Worker if(fd < 0)
161*03ce13f7SAndroid Build Coastguard Worker {
162*03ce13f7SAndroid Build Coastguard Worker return VK_NOT_READY;
163*03ce13f7SAndroid Build Coastguard Worker }
164*03ce13f7SAndroid Build Coastguard Worker
165*03ce13f7SAndroid Build Coastguard Worker drmModeRes *res = drmModeGetResources(fd);
166*03ce13f7SAndroid Build Coastguard Worker pProperties->currentDisplay = res->connectors[0];
167*03ce13f7SAndroid Build Coastguard Worker pProperties->currentStackIndex = 0;
168*03ce13f7SAndroid Build Coastguard Worker drmModeFreeResources(res);
169*03ce13f7SAndroid Build Coastguard Worker close(fd);
170*03ce13f7SAndroid Build Coastguard Worker }
171*03ce13f7SAndroid Build Coastguard Worker
172*03ce13f7SAndroid Build Coastguard Worker return VK_SUCCESS;
173*03ce13f7SAndroid Build Coastguard Worker }
174*03ce13f7SAndroid Build Coastguard Worker
GetPhysicalDeviceDisplayProperties(uint32_t * pPropertyCount,VkDisplayPropertiesKHR * pProperties)175*03ce13f7SAndroid Build Coastguard Worker VkResult DisplaySurfaceKHR::GetPhysicalDeviceDisplayProperties(uint32_t *pPropertyCount, VkDisplayPropertiesKHR *pProperties)
176*03ce13f7SAndroid Build Coastguard Worker {
177*03ce13f7SAndroid Build Coastguard Worker *pPropertyCount = 1;
178*03ce13f7SAndroid Build Coastguard Worker
179*03ce13f7SAndroid Build Coastguard Worker if(pProperties)
180*03ce13f7SAndroid Build Coastguard Worker {
181*03ce13f7SAndroid Build Coastguard Worker const int fd = openCard();
182*03ce13f7SAndroid Build Coastguard Worker if(fd < 0)
183*03ce13f7SAndroid Build Coastguard Worker {
184*03ce13f7SAndroid Build Coastguard Worker return VK_NOT_READY;
185*03ce13f7SAndroid Build Coastguard Worker }
186*03ce13f7SAndroid Build Coastguard Worker
187*03ce13f7SAndroid Build Coastguard Worker drmModeRes *res = drmModeGetResources(fd);
188*03ce13f7SAndroid Build Coastguard Worker drmModeConnector *connector = drmModeGetConnector(fd, res->connectors[0]);
189*03ce13f7SAndroid Build Coastguard Worker pProperties->display = res->connectors[0];
190*03ce13f7SAndroid Build Coastguard Worker pProperties->displayName = "monitor";
191*03ce13f7SAndroid Build Coastguard Worker pProperties->physicalDimensions.width = connector->mmWidth;
192*03ce13f7SAndroid Build Coastguard Worker pProperties->physicalDimensions.height = connector->mmHeight;
193*03ce13f7SAndroid Build Coastguard Worker if(pProperties->physicalDimensions.width <= 0 || pProperties->physicalDimensions.height <= 0)
194*03ce13f7SAndroid Build Coastguard Worker {
195*03ce13f7SAndroid Build Coastguard Worker pProperties->physicalDimensions.width = connector->modes[0].hdisplay * 25.4 / 96;
196*03ce13f7SAndroid Build Coastguard Worker pProperties->physicalDimensions.height = connector->modes[0].vdisplay * 25.4 / 96;
197*03ce13f7SAndroid Build Coastguard Worker }
198*03ce13f7SAndroid Build Coastguard Worker pProperties->physicalResolution.width = connector->modes[0].hdisplay;
199*03ce13f7SAndroid Build Coastguard Worker pProperties->physicalResolution.height = connector->modes[0].vdisplay;
200*03ce13f7SAndroid Build Coastguard Worker pProperties->supportedTransforms = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
201*03ce13f7SAndroid Build Coastguard Worker pProperties->planeReorderPossible = VK_FALSE;
202*03ce13f7SAndroid Build Coastguard Worker pProperties->persistentContent = VK_FALSE;
203*03ce13f7SAndroid Build Coastguard Worker drmModeFreeConnector(connector);
204*03ce13f7SAndroid Build Coastguard Worker drmModeFreeResources(res);
205*03ce13f7SAndroid Build Coastguard Worker close(fd);
206*03ce13f7SAndroid Build Coastguard Worker }
207*03ce13f7SAndroid Build Coastguard Worker
208*03ce13f7SAndroid Build Coastguard Worker return VK_SUCCESS;
209*03ce13f7SAndroid Build Coastguard Worker }
210*03ce13f7SAndroid Build Coastguard Worker
DisplaySurfaceKHR(const VkDisplaySurfaceCreateInfoKHR * pCreateInfo,void * mem)211*03ce13f7SAndroid Build Coastguard Worker DisplaySurfaceKHR::DisplaySurfaceKHR(const VkDisplaySurfaceCreateInfoKHR *pCreateInfo, void *mem)
212*03ce13f7SAndroid Build Coastguard Worker {
213*03ce13f7SAndroid Build Coastguard Worker fd = openCard();
214*03ce13f7SAndroid Build Coastguard Worker if(fd < 0)
215*03ce13f7SAndroid Build Coastguard Worker {
216*03ce13f7SAndroid Build Coastguard Worker return;
217*03ce13f7SAndroid Build Coastguard Worker }
218*03ce13f7SAndroid Build Coastguard Worker
219*03ce13f7SAndroid Build Coastguard Worker drmModeRes *res = drmModeGetResources(fd);
220*03ce13f7SAndroid Build Coastguard Worker connector_id = res->connectors[0];
221*03ce13f7SAndroid Build Coastguard Worker drmModeFreeResources(res);
222*03ce13f7SAndroid Build Coastguard Worker drmModeConnector *connector = drmModeGetConnector(fd, connector_id);
223*03ce13f7SAndroid Build Coastguard Worker encoder_id = connector->encoder_id;
224*03ce13f7SAndroid Build Coastguard Worker memcpy(&mode_info, &connector->modes[0], sizeof(drmModeModeInfo));
225*03ce13f7SAndroid Build Coastguard Worker drmModeFreeConnector(connector);
226*03ce13f7SAndroid Build Coastguard Worker drmModeEncoder *encoder = drmModeGetEncoder(fd, encoder_id);
227*03ce13f7SAndroid Build Coastguard Worker crtc_id = encoder->crtc_id;
228*03ce13f7SAndroid Build Coastguard Worker drmModeFreeEncoder(encoder);
229*03ce13f7SAndroid Build Coastguard Worker
230*03ce13f7SAndroid Build Coastguard Worker crtc = drmModeGetCrtc(fd, crtc_id);
231*03ce13f7SAndroid Build Coastguard Worker
232*03ce13f7SAndroid Build Coastguard Worker struct drm_mode_create_dumb creq;
233*03ce13f7SAndroid Build Coastguard Worker memset(&creq, 0, sizeof(struct drm_mode_create_dumb));
234*03ce13f7SAndroid Build Coastguard Worker creq.width = mode_info.hdisplay;
235*03ce13f7SAndroid Build Coastguard Worker creq.height = mode_info.vdisplay;
236*03ce13f7SAndroid Build Coastguard Worker creq.bpp = 32;
237*03ce13f7SAndroid Build Coastguard Worker drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &creq);
238*03ce13f7SAndroid Build Coastguard Worker
239*03ce13f7SAndroid Build Coastguard Worker handle = creq.handle;
240*03ce13f7SAndroid Build Coastguard Worker width = creq.width;
241*03ce13f7SAndroid Build Coastguard Worker height = creq.height;
242*03ce13f7SAndroid Build Coastguard Worker pitch = creq.pitch;
243*03ce13f7SAndroid Build Coastguard Worker size = creq.size;
244*03ce13f7SAndroid Build Coastguard Worker
245*03ce13f7SAndroid Build Coastguard Worker drmModeAddFB(fd, width, height, 24, 32, pitch, handle, &fb_id);
246*03ce13f7SAndroid Build Coastguard Worker
247*03ce13f7SAndroid Build Coastguard Worker struct drm_mode_map_dumb mreq;
248*03ce13f7SAndroid Build Coastguard Worker memset(&mreq, 0, sizeof(struct drm_mode_map_dumb));
249*03ce13f7SAndroid Build Coastguard Worker mreq.handle = handle;
250*03ce13f7SAndroid Build Coastguard Worker drmIoctl(fd, DRM_IOCTL_MODE_MAP_DUMB, &mreq);
251*03ce13f7SAndroid Build Coastguard Worker
252*03ce13f7SAndroid Build Coastguard Worker fb_buffer = static_cast<uint8_t *>(mmap(NULL, size, PROT_WRITE, MAP_SHARED, fd, mreq.offset));
253*03ce13f7SAndroid Build Coastguard Worker }
254*03ce13f7SAndroid Build Coastguard Worker
destroySurface(const VkAllocationCallbacks * pAllocator)255*03ce13f7SAndroid Build Coastguard Worker void DisplaySurfaceKHR::destroySurface(const VkAllocationCallbacks *pAllocator)
256*03ce13f7SAndroid Build Coastguard Worker {
257*03ce13f7SAndroid Build Coastguard Worker munmap(fb_buffer, size);
258*03ce13f7SAndroid Build Coastguard Worker
259*03ce13f7SAndroid Build Coastguard Worker drmModeRmFB(fd, fb_id);
260*03ce13f7SAndroid Build Coastguard Worker
261*03ce13f7SAndroid Build Coastguard Worker struct drm_mode_destroy_dumb dreq;
262*03ce13f7SAndroid Build Coastguard Worker memset(&dreq, 0, sizeof(struct drm_mode_destroy_dumb));
263*03ce13f7SAndroid Build Coastguard Worker dreq.handle = handle;
264*03ce13f7SAndroid Build Coastguard Worker drmIoctl(fd, DRM_IOCTL_MODE_DESTROY_DUMB, &dreq);
265*03ce13f7SAndroid Build Coastguard Worker
266*03ce13f7SAndroid Build Coastguard Worker drmModeSetCrtc(fd, crtc->crtc_id, crtc->buffer_id, crtc->x, crtc->y, &connector_id, 1, &crtc->mode);
267*03ce13f7SAndroid Build Coastguard Worker drmModeFreeCrtc(crtc);
268*03ce13f7SAndroid Build Coastguard Worker
269*03ce13f7SAndroid Build Coastguard Worker close(fd);
270*03ce13f7SAndroid Build Coastguard Worker }
271*03ce13f7SAndroid Build Coastguard Worker
ComputeRequiredAllocationSize(const VkDisplaySurfaceCreateInfoKHR * pCreateInfo)272*03ce13f7SAndroid Build Coastguard Worker size_t DisplaySurfaceKHR::ComputeRequiredAllocationSize(const VkDisplaySurfaceCreateInfoKHR *pCreateInfo)
273*03ce13f7SAndroid Build Coastguard Worker {
274*03ce13f7SAndroid Build Coastguard Worker return 0;
275*03ce13f7SAndroid Build Coastguard Worker }
276*03ce13f7SAndroid Build Coastguard Worker
getSurfaceCapabilities(const void * pSurfaceInfoPNext,VkSurfaceCapabilitiesKHR * pSurfaceCapabilities,void * pSurfaceCapabilitiesPNext) const277*03ce13f7SAndroid Build Coastguard Worker VkResult DisplaySurfaceKHR::getSurfaceCapabilities(const void *pSurfaceInfoPNext, VkSurfaceCapabilitiesKHR *pSurfaceCapabilities, void *pSurfaceCapabilitiesPNext) const
278*03ce13f7SAndroid Build Coastguard Worker {
279*03ce13f7SAndroid Build Coastguard Worker VkExtent2D extent = { width, height };
280*03ce13f7SAndroid Build Coastguard Worker
281*03ce13f7SAndroid Build Coastguard Worker pSurfaceCapabilities->currentExtent = extent;
282*03ce13f7SAndroid Build Coastguard Worker pSurfaceCapabilities->minImageExtent = extent;
283*03ce13f7SAndroid Build Coastguard Worker pSurfaceCapabilities->maxImageExtent = extent;
284*03ce13f7SAndroid Build Coastguard Worker
285*03ce13f7SAndroid Build Coastguard Worker setCommonSurfaceCapabilities(pSurfaceInfoPNext, pSurfaceCapabilities, pSurfaceCapabilitiesPNext);
286*03ce13f7SAndroid Build Coastguard Worker return VK_SUCCESS;
287*03ce13f7SAndroid Build Coastguard Worker }
288*03ce13f7SAndroid Build Coastguard Worker
attachImage(PresentImage * image)289*03ce13f7SAndroid Build Coastguard Worker void DisplaySurfaceKHR::attachImage(PresentImage *image)
290*03ce13f7SAndroid Build Coastguard Worker {
291*03ce13f7SAndroid Build Coastguard Worker }
292*03ce13f7SAndroid Build Coastguard Worker
detachImage(PresentImage * image)293*03ce13f7SAndroid Build Coastguard Worker void DisplaySurfaceKHR::detachImage(PresentImage *image)
294*03ce13f7SAndroid Build Coastguard Worker {
295*03ce13f7SAndroid Build Coastguard Worker }
296*03ce13f7SAndroid Build Coastguard Worker
present(PresentImage * image)297*03ce13f7SAndroid Build Coastguard Worker VkResult DisplaySurfaceKHR::present(PresentImage *image)
298*03ce13f7SAndroid Build Coastguard Worker {
299*03ce13f7SAndroid Build Coastguard Worker image->getImage()->copyTo(fb_buffer, pitch);
300*03ce13f7SAndroid Build Coastguard Worker drmModeSetCrtc(fd, crtc_id, fb_id, 0, 0, &connector_id, 1, &mode_info);
301*03ce13f7SAndroid Build Coastguard Worker
302*03ce13f7SAndroid Build Coastguard Worker return VK_SUCCESS;
303*03ce13f7SAndroid Build Coastguard Worker }
304*03ce13f7SAndroid Build Coastguard Worker
305*03ce13f7SAndroid Build Coastguard Worker } // namespace vk
306