blob: 4651a8abe18feff275d04cf1cd2d8e66a3a807c1 [file] [log] [blame]
/*
* XGL 3-D graphics library
*
* Copyright (C) 2014 LunarG, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS 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 SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* Authors:
* Courtney Goeltzenleuchter <courtney@lunarg.com>
*/
#include <string.h>
#include "driver.h"
#include "GitSHA1.h"
// TODO: Really want to eliminate these
#define FAKE_PROPERTY 42
// TODO: What command queues can we support?
#define NUM_QUEUES 1
XGL_RESULT XGLAPI gen7_GetGpuProperties(struct _xgl_device *pdev,
XGL_SIZE * pDataSize,
XGL_PHYSICAL_GPU_PROPERTIES * pData)
{
const char *chipset;
*pDataSize = sizeof(XGL_PHYSICAL_GPU_PROPERTIES);
pData->apiVersion = XGL_API_VERSION;
// TODO: Should have driver version string
// TODO: What should version number look like?
pData->driverVersion = 1;
pData->vendorId = pdev->ven_id;
pData->deviceId = pdev->dev_id;
pData->gpuType = XGL_GPU_TYPE_INTEGRATED;
switch (pdev->dev_id) {
#undef CHIPSET
#define CHIPSET(id, symbol, str) case id: chipset = str; break;
#include "i965_pci_ids.h"
default:
chipset = "Unknown Intel Chipset";
break;
}
strncpy((char *) pData->gpuName, chipset, XGL_MAX_PHYSICAL_GPU_NAME);
// TODO: Need real values here.
pData->maxMemRefsPerSubmission = FAKE_PROPERTY;
pData->virtualMemPageSize = FAKE_PROPERTY;
pData->maxInlineMemoryUpdateSize = FAKE_PROPERTY;
pData->maxBoundDescriptorSets = FAKE_PROPERTY;
pData->maxThreadGroupSize = FAKE_PROPERTY;
pData->timestampFrequency = FAKE_PROPERTY;
pData->multiColorAttachmentClears = FAKE_PROPERTY;
return XGL_SUCCESS;
}
XGL_RESULT XGLAPI gen7_GetGpuPerformance(struct _xgl_device *pdev,
XGL_SIZE * pDataSize,
XGL_PHYSICAL_GPU_PERFORMANCE * pData)
{
*pDataSize = sizeof(XGL_PHYSICAL_GPU_PERFORMANCE);
pData->maxGpuClock = FAKE_PROPERTY;
pData->aluPerClock = FAKE_PROPERTY;
pData->texPerClock = FAKE_PROPERTY;
pData->primsPerClock = FAKE_PROPERTY;
pData->pixelsPerClock = FAKE_PROPERTY;
return XGL_SUCCESS;
}
XGL_RESULT XGLAPI gen7_GetGpuQueueProperties(struct _xgl_device *pdev,
XGL_SIZE * pDataSize,
XGL_PHYSICAL_GPU_QUEUE_PROPERTIES * pData)
{
*pDataSize = NUM_QUEUES * sizeof(XGL_PHYSICAL_GPU_QUEUE_PROPERTIES);
pData[0].structSize = sizeof(XGL_PHYSICAL_GPU_QUEUE_PROPERTIES);
pData[0].queueFlags = XGL_QUEUE_GRAPHICS_BIT;
pData[0].queueCount = 1; // TODO: What is this counting?
pData[0].supportsTimestamps = XGL_TRUE;
return XGL_SUCCESS;
}
XGL_RESULT XGLAPI gen7_GetGpuMemoryProperties(struct _xgl_device *pdev,
XGL_SIZE * pDataSize,
XGL_PHYSICAL_GPU_MEMORY_PROPERTIES * pData)
{
*pDataSize = sizeof(XGL_PHYSICAL_GPU_MEMORY_PROPERTIES);
// TODO: Need to set the flags properly
pData[0].supportsMigration = XGL_FALSE;
pData[0].supportsPinning = XGL_TRUE;
pData[0].supportsVirtualMemoryRemapping = XGL_FALSE;
return XGL_SUCCESS;
}
XGL_RESULT XGLAPI gen7_GetGpuInfo(XGL_PHYSICAL_GPU gpu,
XGL_PHYSICAL_GPU_INFO_TYPE infoType,
XGL_SIZE * pDataSize, XGL_VOID * pData)
{
XGL_RESULT ret = XGL_SUCCESS;
struct _xgl_device *pdev = (struct _xgl_device *) gpu;
switch (infoType) {
case XGL_INFO_TYPE_PHYSICAL_GPU_PROPERTIES:
if (pData == NULL) {
return XGL_ERROR_INVALID_POINTER;
}
return gen7_GetGpuProperties(pdev, pDataSize, pData);
break;
case XGL_INFO_TYPE_PHYSICAL_GPU_PERFORMANCE:
if (pData == NULL) {
return XGL_ERROR_INVALID_POINTER;
}
return gen7_GetGpuPerformance(pdev, pDataSize, pData);
break;
case XGL_INFO_TYPE_PHYSICAL_GPU_QUEUE_PROPERTIES:
/*
* XGL Programmers guide, page 33:
* to determine the data size an application calls
* xglGetGpuInfo() with a NULL data pointer. The
* expected data size for all queue property structures
* is returned in pDataSize
*/
if (pData == NULL) {
// TODO: Count queues and return space needed
*pDataSize = NUM_QUEUES * sizeof(XGL_PHYSICAL_GPU_QUEUE_PROPERTIES);
}
return gen7_GetGpuQueueProperties(pdev, pDataSize, pData);
break;
case XGL_INFO_TYPE_PHYSICAL_GPU_MEMORY_PROPERTIES:
if (pData == NULL) {
return XGL_ERROR_INVALID_POINTER;
}
return gen7_GetGpuMemoryProperties(pdev, pDataSize, pData);
break;
default:
ret = XGL_ERROR_INVALID_VALUE;
}
return ret;
}