#include "d3dadapter/d3dadapter9.h"
#include "d3dadapter/drm.h"
-#include "xmlconfig.h"
-#include "xmlpool.h"
+#include "util/xmlconfig.h"
+#include "util/xmlpool.h"
-#include <drm.h>
+#include "drm-uapi/drm.h"
#include <sys/ioctl.h>
#include <fcntl.h>
#include <stdio.h>
DRI_CONF_VBLANK_MODE(DRI_CONF_VBLANK_DEF_INTERVAL_1)
DRI_CONF_SECTION_END
DRI_CONF_SECTION_NINE
+ DRI_CONF_NINE_OVERRIDEVENDOR(-1)
DRI_CONF_NINE_THROTTLE(-2)
DRI_CONF_NINE_THREADSUBMIT("false")
+ DRI_CONF_NINE_ALLOWDISCARDDELAYEDRELEASE("true")
+ DRI_CONF_NINE_TEARFREEDISCARD("false")
+ DRI_CONF_NINE_CSMT(-1)
+ DRI_CONF_NINE_DYNAMICTEXTUREWORKAROUND("false")
+ DRI_CONF_NINE_SHADERINLINECONSTANTS("false")
DRI_CONF_SECTION_END
DRI_CONF_END;
-/* define fallback value here: NVIDIA GeForce GTX 970 */
-#define FALLBACK_NAME "NV124"
-#define FALLBACK_DEVID 0x13C2
-#define FALLBACK_VENID 0x10de
+struct fallback_card_config {
+ const char *name;
+ unsigned vendor_id;
+ unsigned device_id;
+} fallback_cards[] = {
+ {"NV124", 0x10de, 0x13C2}, /* NVIDIA GeForce GTX 970 */
+ {"HAWAII", 0x1002, 0x67b1}, /* AMD Radeon R9 290 */
+ {"Haswell Mobile", 0x8086, 0x13C2}, /* Intel Haswell Mobile */
+ {"SVGA3D", 0x15ad, 0x0405}, /* VMware SVGA 3D */
+};
/* prototypes */
void
d3d_match_vendor_id( D3DADAPTER_IDENTIFIER9* drvid,
- unsigned fallback_ven,
- unsigned fallback_dev,
- const char* fallback_name );
+ unsigned fallback_ven,
+ unsigned fallback_dev,
+ const char* fallback_name );
void d3d_fill_driver_version(D3DADAPTER_IDENTIFIER9* drvid);
*subsysid = 0;
*revision = 0;
} else {
- DBG("Unable to detect card. Faking %s\n", FALLBACK_NAME);
- *vendorid = FALLBACK_VENID;
- *deviceid = FALLBACK_DEVID;
+ DBG("Unable to detect card. Faking %s\n", fallback_cards[0].name);
+ *vendorid = fallback_cards[0].vendor_id;
+ *deviceid = fallback_cards[0].device_id;
*subsysid = 0;
*revision = 0;
}
static inline void
read_descriptor( struct d3dadapter9_context *ctx,
- int fd )
+ int fd, int override_vendorid )
{
+ unsigned i;
+ BOOL found;
D3DADAPTER_IDENTIFIER9 *drvid = &ctx->identifier;
memset(drvid, 0, sizeof(*drvid));
&drvid->SubSysId, &drvid->Revision);
snprintf(drvid->DeviceName, sizeof(drvid->DeviceName),
"Gallium 0.4 with %s", ctx->hal->get_vendor(ctx->hal));
- strncpy(drvid->Description, ctx->hal->get_name(ctx->hal),
- sizeof(drvid->Description));
-
+ snprintf(drvid->Description, sizeof(drvid->Description),
+ "%s", ctx->hal->get_name(ctx->hal));
+
+ if (override_vendorid > 0) {
+ found = FALSE;
+ /* fill in device_id and card name for fake vendor */
+ for (i = 0; i < sizeof(fallback_cards)/sizeof(fallback_cards[0]); i++) {
+ if (fallback_cards[i].vendor_id == override_vendorid) {
+ DBG("Faking card '%s' vendor 0x%04x, device 0x%04x\n",
+ fallback_cards[i].name,
+ fallback_cards[i].vendor_id,
+ fallback_cards[i].device_id);
+ drvid->VendorId = fallback_cards[i].vendor_id;
+ drvid->DeviceId = fallback_cards[i].device_id;
+ snprintf(drvid->Description, sizeof(drvid->Description),
+ "%s", fallback_cards[i].name);
+ found = TRUE;
+ break;
+ }
+ }
+ if (!found) {
+ DBG("Unknown fake vendor 0x%04x! Using detected vendor !\n", override_vendorid);
+ }
+ }
/* choose fall-back vendor if necessary to allow
* the following functions to return sane results */
- d3d_match_vendor_id(drvid, FALLBACK_VENID, FALLBACK_DEVID, FALLBACK_NAME);
+ d3d_match_vendor_id(drvid, fallback_cards[0].vendor_id, fallback_cards[0].device_id, fallback_cards[0].name);
/* fill in driver name and version info */
d3d_fill_driver_version(drvid);
/* override Description field with Windows like names */
{
struct d3dadapter9drm_context *ctx = CALLOC_STRUCT(d3dadapter9drm_context);
HRESULT hr;
- int different_device;
- const struct drm_conf_ret *throttle_ret = NULL;
- const struct drm_conf_ret *dmabuf_ret = NULL;
+ bool different_device;
driOptionCache defaultInitOptions;
driOptionCache userInitOptions;
int throttling_value_user = -2;
+ int override_vendorid = -1;
if (!ctx) { return E_OUTOFMEMORY; }
* takes ownership of it. */
fd = loader_get_user_preferred_fd(fd, &different_device);
ctx->fd = fd;
- ctx->base.linear_framebuffer = !!different_device;
+ ctx->base.linear_framebuffer = different_device;
if (!pipe_loader_drm_probe_fd(&ctx->dev, fd)) {
ERR("Failed to probe drm fd %d.\n", fd);
return D3DERR_DRIVERINTERNALERROR;
}
- dmabuf_ret = pipe_loader_configuration(ctx->dev, DRM_CONF_SHARE_FD);
- throttle_ret = pipe_loader_configuration(ctx->dev, DRM_CONF_THROTTLE);
- if (!dmabuf_ret || !dmabuf_ret->val.val_bool) {
+ if (!ctx->base.hal->get_param(ctx->base.hal, PIPE_CAP_DMABUF)) {
ERR("The driver is not capable of dma-buf sharing."
"Abandon to load nine state tracker\n");
drm_destroy(&ctx->base);
return D3DERR_DRIVERINTERNALERROR;
}
- if (throttle_ret && throttle_ret->val.val_int != -1) {
- ctx->base.throttling = TRUE;
- ctx->base.throttling_value = throttle_ret->val.val_int;
- } else
- ctx->base.throttling = FALSE;
+ /* Previously was set to PIPE_CAP_MAX_FRAMES_IN_FLIGHT,
+ * but the change of value of this cap to 1 seems to cause
+ * regressions. */
+ ctx->base.throttling_value = 2;
+ ctx->base.throttling = ctx->base.throttling_value > 0;
driParseOptionInfo(&defaultInitOptions, __driConfigOptionsNine);
- driParseConfigFiles(&userInitOptions, &defaultInitOptions, 0, "nine");
+ driParseConfigFiles(&userInitOptions, &defaultInitOptions, 0,
+ "nine", NULL, NULL, 0);
if (driCheckOption(&userInitOptions, "throttle_value", DRI_INT)) {
throttling_value_user = driQueryOptioni(&userInitOptions, "throttle_value");
if (throttling_value_user == -1)
else
ctx->base.vblank_mode = 1;
- if (driCheckOption(&userInitOptions, "thread_submit", DRI_BOOL)) {
+ if (driCheckOption(&userInitOptions, "thread_submit", DRI_BOOL))
ctx->base.thread_submit = driQueryOptionb(&userInitOptions, "thread_submit");
- if (ctx->base.thread_submit && (throttling_value_user == -2 || throttling_value_user == 0)) {
- ctx->base.throttling_value = 0;
- } else if (ctx->base.thread_submit) {
- DBG("You have set a non standard throttling value in combination with thread_submit."
- "We advise to use a throttling value of -2/0");
- }
- if (ctx->base.thread_submit && !different_device)
- DBG("You have set thread_submit but do not use a different device than the server."
- "You should not expect any benefit.");
+ else
+ ctx->base.thread_submit = different_device;
+
+ if (driCheckOption(&userInitOptions, "override_vendorid", DRI_INT)) {
+ override_vendorid = driQueryOptioni(&userInitOptions, "override_vendorid");
+ }
+
+ if (driCheckOption(&userInitOptions, "discard_delayed_release", DRI_BOOL))
+ ctx->base.discard_delayed_release = driQueryOptionb(&userInitOptions, "discard_delayed_release");
+ else
+ ctx->base.discard_delayed_release = TRUE;
+
+ if (driCheckOption(&userInitOptions, "tearfree_discard", DRI_BOOL))
+ ctx->base.tearfree_discard = driQueryOptionb(&userInitOptions, "tearfree_discard");
+ else
+ ctx->base.tearfree_discard = FALSE;
+
+ if (ctx->base.tearfree_discard && !ctx->base.discard_delayed_release) {
+ ERR("tearfree_discard requires discard_delayed_release\n");
+ ctx->base.tearfree_discard = FALSE;
}
+ if (driCheckOption(&userInitOptions, "csmt_force", DRI_INT))
+ ctx->base.csmt_force = driQueryOptioni(&userInitOptions, "csmt_force");
+ else
+ ctx->base.csmt_force = -1;
+
+ if (driCheckOption(&userInitOptions, "dynamic_texture_workaround", DRI_BOOL))
+ ctx->base.dynamic_texture_workaround = driQueryOptionb(&userInitOptions, "dynamic_texture_workaround");
+ else
+ ctx->base.dynamic_texture_workaround = FALSE;
+
+ if (driCheckOption(&userInitOptions, "shader_inline_constants", DRI_BOOL))
+ ctx->base.shader_inline_constants = driQueryOptionb(&userInitOptions, "shader_inline_constants");
+ else
+ ctx->base.shader_inline_constants = FALSE;
+
driDestroyOptionCache(&userInitOptions);
driDestroyOptionInfo(&defaultInitOptions);
}
/* read out PCI info */
- read_descriptor(&ctx->base, fd);
+ read_descriptor(&ctx->base, fd, override_vendorid);
/* create and return new ID3DAdapter9 */
hr = NineAdapter9_new(&ctx->base, (struct NineAdapter9 **)ppAdapter);