xserver-multidpi/glx/vndservervendor.c

92 lines
3.3 KiB
C

/*
* Copyright (c) 2016, NVIDIA CORPORATION.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and/or associated documentation files (the
* "Materials"), to deal in the Materials without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Materials, and to
* permit persons to whom the Materials are furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be included
* unaltered in all copies or substantial portions of the Materials.
* Any additions, deletions, or changes to the original source files
* must be clearly indicated in accompanying documentation.
*
* If only executable code is distributed, then the accompanying
* documentation must state that "this software is based in part on the
* work of the Khronos Group."
*
* THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
* MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
*/
#include "vndservervendor.h"
struct xorg_list GlxVendorList = { &GlxVendorList, &GlxVendorList };
GlxServerVendor *GlxCreateVendor(const GlxServerImports *imports)
{
GlxServerVendor *vendor = NULL;
if (imports == NULL) {
ErrorF("GLX: Vendor library did not provide an imports table\n");
return NULL;
}
if (imports->extensionCloseDown == NULL
|| imports->handleRequest == NULL
|| imports->getDispatchAddress == NULL
|| imports->makeCurrent == NULL) {
ErrorF("GLX: Vendor library is missing required callback functions.\n");
return NULL;
}
vendor = (GlxServerVendor *) calloc(1, sizeof(GlxServerVendor));
if (vendor == NULL) {
ErrorF("GLX: Can't allocate vendor library.\n");
return NULL;
}
memcpy(&vendor->glxvc, imports, sizeof(GlxServerImports));
xorg_list_append(&vendor->entry, &GlxVendorList);
return vendor;
}
void GlxDestroyVendor(GlxServerVendor *vendor)
{
if (vendor != NULL) {
xorg_list_del(&vendor->entry);
free(vendor);
}
}
void GlxVendorExtensionReset(const ExtensionEntry *extEntry)
{
GlxServerVendor *vendor, *tempVendor;
// TODO: Do we allow the driver to destroy a vendor library handle from
// here?
xorg_list_for_each_entry_safe(vendor, tempVendor, &GlxVendorList, entry) {
if (vendor->glxvc.extensionCloseDown != NULL) {
vendor->glxvc.extensionCloseDown(extEntry);
}
}
// If the server is exiting instead of starting a new generation, then
// free the remaining GlxServerVendor structs.
//
// XXX this used to be conditional on xf86ServerIsExiting, but it's
// cleaner to just always create the vendor struct on every generation,
// if nothing else so all ddxes get the same behavior.
xorg_list_for_each_entry_safe(vendor, tempVendor, &GlxVendorList, entry) {
GlxDestroyVendor(vendor);
}
}