1
0
mirror of https://github.com/Yours3lf/rpi-vk-driver.git synced 2025-02-19 16:54:18 +01:00

fixed some modesetting bugs

This commit is contained in:
Unknown 2020-04-16 00:34:51 +01:00
parent a67cf48094
commit c6281bb757
4 changed files with 35 additions and 13 deletions

View File

@ -323,7 +323,7 @@ void modeset_destroy(int fd, modeset_dev* dev)
void modeset_enum_displays(int fd, uint32_t* numDisplays, modeset_display** displays)
void modeset_enum_displays(int fd, uint32_t* numDisplays, modeset_display* displays)
{
drmModeResPtr resPtr = drmModeGetResources(fd);
@ -363,10 +363,10 @@ void modeset_enum_displays(int fd, uint32_t* numDisplays, modeset_display** disp
*numDisplays = tmpNumDisplays;
memcpy(*displays, tmpDisplays, tmpNumDisplays * sizeof(modeset_display));
memcpy(displays, tmpDisplays, tmpNumDisplays * sizeof(modeset_display));
}
void modeset_enum_modes_for_display(int fd, uint32_t display, uint32_t* numModes, modeset_display_mode** modes)
void modeset_enum_modes_for_display(int fd, uint32_t display, uint32_t* numModes, modeset_display_mode* modes)
{
drmModeResPtr resPtr = drmModeGetResources(fd);
@ -392,7 +392,7 @@ void modeset_enum_modes_for_display(int fd, uint32_t display, uint32_t* numModes
drmModeFreeResources(resPtr);
*numModes = tmpNumModes;
memcpy(*modes, tmpModes, tmpNumModes * sizeof(modeset_display_mode));
memcpy(modes, tmpModes, tmpNumModes * sizeof(modeset_display_mode));
}
void modeset_create_surface_for_mode(int fd, uint32_t display, uint32_t mode, modeset_display_surface* surface)

View File

@ -51,7 +51,7 @@ typedef struct modeset_display_surface {
uint32_t modeID;
uint32_t encoderID;
uint32_t crtcID;
} modeset_display_mode;
} modeset_display_surface;
modeset_dev* modeset_create(int fd);
void modeset_present_buffer(int fd, modeset_dev* dev, _image* buffer);
@ -60,8 +60,8 @@ int modeset_create_fb(int fd, _image *buf);
void modeset_destroy_fb(int fd, _image *buf);
int modeset_fb_for_dev(int fd, modeset_dev* dev, _image* buffer);
void modeset_enum_displays(int fd, uint32_t* numDisplays, modeset_display** displays);
void modeset_enum_modes_for_display(int fd, uint32_t display, uint32_t* numModes, modeset_display_mode** modes);
void modeset_enum_displays(int fd, uint32_t* numDisplays, modeset_display* displays);
void modeset_enum_modes_for_display(int fd, uint32_t display, uint32_t* numModes, modeset_display_mode* modes);
void modeset_create_surface_for_mode(int fd, uint32_t display, uint32_t mode, modeset_display_surface* surface);
#if defined (__cplusplus)

View File

@ -19,7 +19,7 @@ VKAPI_ATTR VkResult VKAPI_CALL rpi_vkGetPhysicalDeviceDisplayPropertiesKHR(
uint32_t numDisplays;
modeset_display displays[16];
modeset_enum_displays(controlFd, &numDisplays, &displays);
modeset_enum_displays(controlFd, &numDisplays, displays);
if(!pProperties)
{
@ -130,7 +130,8 @@ VKAPI_ATTR VkResult VKAPI_CALL rpi_vkCreateDisplayPlaneSurfaceKHR(
assert(instance);
assert(pSurface);
_displayMode mode = pCreateInfo->displayMode;
_displayMode mode;
memcpy(&mode, &pCreateInfo->displayMode, sizeof(_displayMode));
modeset_display_surface* surface = ALLOCATE(sizeof(modeset_display_surface), 1, VK_SYSTEM_ALLOCATION_SCOPE_INSTANCE);
modeset_create_surface_for_mode(controlFd, mode.connectorID, mode.modeID, surface);

View File

@ -235,10 +235,29 @@ void createWindowSurface() {
VkDisplayPropertiesKHR* displayProperties = (VkDisplayPropertiesKHR*)malloc(sizeof(VkDisplayPropertiesKHR)*displayCount);
vkGetPhysicalDeviceDisplayPropertiesKHR(physicalDevice, &displayCount, displayProperties);
uint32_t propertyCount;
vkGetDisplayModePropertiesKHR(physicalDevice, displayProperties[0].display, &propertyCount, 0);
VkDisplayModePropertiesKHR* displayModeProperties = (VkDisplayModePropertiesKHR*)malloc(sizeof(VkDisplayModePropertiesKHR)*propertyCount);
vkGetDisplayModePropertiesKHR(physicalDevice, displayProperties[0].display, &propertyCount, displayModeProperties);
printf("Enumerated displays\n");
for(uint32_t c = 0; c < displayCount; ++c)
{
printf("Display ID %i\n", displayProperties[c].display);
printf("Display name %s\n", displayProperties[c].displayName);
printf("Display width %i\n", displayProperties[c].physicalDimensions.width);
printf("Display height %i\n", displayProperties[c].physicalDimensions.height);
printf("Display horizontal resolution %i\n", displayProperties[c].physicalResolution.width);
printf("Display vertical resolution %i\n", displayProperties[c].physicalResolution.height);
}
uint32_t modeCount;
vkGetDisplayModePropertiesKHR(physicalDevice, displayProperties[0].display, &modeCount, 0);
VkDisplayModePropertiesKHR* displayModeProperties = (VkDisplayModePropertiesKHR*)malloc(sizeof(VkDisplayModePropertiesKHR)*modeCount);
vkGetDisplayModePropertiesKHR(physicalDevice, displayProperties[0].display, &modeCount, displayModeProperties);
printf("\nEnumerated modes\n");
for(uint32_t c = 0; c < modeCount; ++c)
{
printf("Mode refresh rate %i\n", displayModeProperties[c].parameters.refreshRate);
printf("Mode width %i\n", displayModeProperties[c].parameters.visibleRegion.width);
printf("Mode height %i\n\n", displayModeProperties[c].parameters.visibleRegion.height);
}
VkDisplayModeCreateInfoKHR dmci = {};
dmci.sType = VK_STRUCTURE_TYPE_DISPLAY_MODE_CREATE_INFO_KHR;
@ -255,6 +274,8 @@ void createWindowSurface() {
vkCreateDisplayPlaneSurfaceKHR(instance, &dsci, 0, &windowSurface);
std::cout << "created window surface" << std::endl;
exit(0);
}
void findPhysicalDevice() {