Nvidia: Einstellungen gegen Tearing in 375.10

Fusselbär

Makefile Voyeur
Mit dem neuen Beta Release 375.10 gibt es nun Einstellungen gegen das Tearing ForceCompositionPipeline und ForceFullCompositionPipeline direkt in den nvidia-settings:
https://devtalk.nvidia.com/default/topic/972585/linux-solaris-and-freebsd-driver-375-10-beta-

Leider ist das compilern unter FreeBSD ein bisschen trickreich, weil die nvidia-settings in der Version 375.10 nach dem nvml.h Header aus dem GPU Deployment Kit verlangen, was es leider nicht nativ für FreeBSD gibt. Experimente mit dem implantieren einer Linux Version in compat habe ich dann doch nicht gewagt.

Aber: ich hab es auch so hinbekommen, ohne den nvml.h Header aus dem GPU Deployment Kit:

nvidia-settings-compostion-pipeline-switches.png
Das ist der Patch:
Code:
--- src/libXNVCtrlAttributes/NvCtrlAttributesNvml.c.orig        2016-10-21 15:05:26 UTC
+++ src/libXNVCtrlAttributes/NvCtrlAttributesNvml.c
@@ -33,7 +33,9 @@
#include "NVCtrlLib.h"
-#include "nvml.h"
+#ifdef NVML_AVAILABLE                                                                                                                                                                                                                                                        
+                                                                                                                                                                                                                                                                             
+#include <nvml.h>                                                                                                                                                                                                                                                            
                                                                                                                                                                                                                                                                              
                                                                                                                                                                                                                                                                              
#define MAX_NVML_STR_LEN 64                                                                                                                                                                                                                                                  
@@ -126,12 +128,14 @@ static void printNvmlError(nvmlReturn_t                                                                                                                                                                                                                 
                          "operating system/cgroups");                                                                                                                                                                                                                        
             break;                                                                                                                                                                                                                                                           
                                                                                                                                                                                                                                                                              
-        default:                                                                                                                                                                                                                                                             
+        case NVML_ERROR_UNKNOWN:                                                                                                                                                                                                                                             
             nv_error_msg("An internal driver error occurred");                                                                                                                                                                                                               
             break;                                                                                                                                                                                                                                                           
     }                                                                                                                                                                                                                                                                        
}                                                                                                                                                                                                                                                                            
                                                                                                                                                                                                                                                                              
+#endif // NVML_AVAILABLE                                                                                                                                                                                                                                                     
+                                                                                                                                                                                                                                                                             
                                                                                                                                                                                                                                                                              
/*                                                                                                                                                                                                                                                                           
  * Loads and initializes the NVML library                                                                                                                                                                                                                                    
@@ -139,6 +143,8 @@ static void printNvmlError(nvmlReturn_t                                                                                                                                                                                                                   
                                                                                                                                                                                                                                                                              
ReturnStatus NvCtrlInitNvml(void)                                                                                                                                                                                                                                            
{                                                                                                                                                                                                                                                                            
+#ifdef NVML_AVAILABLE                                                                                                                                                                                                                                                        
+                                                                                                                                                                                                                                                                             
     if (!__isNvmlLoaded) {                                                                                                                                                                                                                                                   
         nvmlReturn_t ret = nvmlInit();                                                                                                                                                                                                                                       
         if (ret != NVML_SUCCESS) {                                                                                                                                                                                                                                           
@@ -152,6 +158,10 @@ ReturnStatus NvCtrlInitNvml(void)                                                                                                                                                                                                                        
     __nvmlUsers++;                                                                                                                                                                                                                                                           
                                                                                                                                                                                                                                                                              
     return NvCtrlSuccess;                                                                                                                                                                                                                                                    
+                                                                                                                                                                                                                                                                             
+#else                                                                                                                                                                                                                                                                        
+    return NvCtrlMissingExtension;                                                                                                                                                                                                                                           
+#endif
}
@@ -162,6 +172,8 @@ ReturnStatus NvCtrlInitNvml(void)
ReturnStatus NvCtrlDestroyNvml(void)
{
+#ifdef NVML_AVAILABLE
+
     if (__isNvmlLoaded) {
         __nvmlUsers--;
         if (__nvmlUsers == 0) {
@@ -174,6 +186,10 @@ ReturnStatus NvCtrlDestroyNvml(void)
         }
     }
     return NvCtrlSuccess;
+
+#else
+    return NvCtrlMissingExtension;
+#endif
}
@@ -184,37 +200,26 @@ ReturnStatus NvCtrlDestroyNvml(void)
  * XXX Needed while using NV-CONTROL as fallback during the migration process
  */
-static Bool matchNvCtrlWithNvmlIds(const NvCtrlAttributePrivateHandle *h,
-                                   int nvmlGpuCount,
+#ifdef NVML_AVAILABLE
+
+static void matchNvCtrlWithNvmlIds(const NvCtrlAttributePrivateHandle *h,
+                                   int deviceCount,
                                    unsigned int **idsDictionary)
{
     char nvmlUUID[MAX_NVML_STR_LEN];
     char *nvctrlUUID = NULL;
     nvmlDevice_t device;
     int i, j;
-    int nvctrlGpuCount = 0;
-    ReturnStatus ret;
-    /* Get the gpu count returned by NV-CONTROL.
-     * If there is mismatch between count returned by NVML and NV-CONTROL
-     * return early.
-     */
-    ret = XNVCTRLQueryTargetCount(h->dpy, NV_CTRL_TARGET_TYPE_GPU,
-                                  &nvctrlGpuCount);
-
-    if ((ret != NvCtrlSuccess) || (nvctrlGpuCount != nvmlGpuCount)) {
-        return FALSE;
-    }
-
-    *idsDictionary = nvalloc(nvmlGpuCount * sizeof(unsigned int));
+    *idsDictionary = nvalloc(deviceCount * sizeof(unsigned int));
     /* Fallback case is to use same id either for NV-CONTROL and NVML */
-    for (i = 0; i < nvmlGpuCount; i++) {
+    for (i = 0; i < deviceCount; i++) {
         (*idsDictionary)[i] = i;
     }
    
     if (h->nv != NULL) {
-        for (i = 0; i < nvctrlGpuCount; i++) {
+        for (i = 0; i < deviceCount; i++) {
             /* Get GPU UUID through NV-CONTROL */
             if (!XNVCTRLQueryTargetStringAttribute(h->dpy,
                                                    NV_CTRL_TARGET_TYPE_GPU,
@@ -229,7 +234,7 @@ static Bool matchNvCtrlWithNvmlIds(const
             }
             /* Look for the same UUID through NVML */
-            for (j = 0; j < nvmlGpuCount; j++) {
+            for (j = 0; j < deviceCount; j++) {
                 if (NVML_SUCCESS != nvmlDeviceGetHandleByIndex(j, &device)) {
                     continue;
                 }
@@ -249,9 +254,10 @@ static Bool matchNvCtrlWithNvmlIds(const
             XFree(nvctrlUUID);
         }
     }
-    return TRUE;
}
+#endif // NVML_AVAILABLE
+
/*
@@ -261,6 +267,8 @@ static Bool matchNvCtrlWithNvmlIds(const
NvCtrlNvmlAttributes *NvCtrlInitNvmlAttributes(NvCtrlAttributePrivateHandle *h)
{
+#ifdef NVML_AVAILABLE
+
     NvCtrlNvmlAttributes *nvml = NULL;
     unsigned int count;
     unsigned int *nvctrlToNvmlId;
@@ -292,9 +300,7 @@ NvCtrlNvmlAttributes *NvCtrlInitNvmlAttr
     }
     /* Fill the NV-CONTROL to NVML IDs dictionary */
-    if (!matchNvCtrlWithNvmlIds(h, count, &nvctrlToNvmlId)) {
-        goto fail;
-    }
+    matchNvCtrlWithNvmlIds(h, count, &nvctrlToNvmlId);
     /*
      * Fill 'sensorCountPerGPU', 'coolerCountPerGPU' and properly set
@@ -360,6 +366,10 @@ NvCtrlNvmlAttributes *NvCtrlInitNvmlAttr
     free(nvml->coolerCountPerGPU);
     free(nvml);
     return NULL;
+
+#else
+    return NULL;
+#endif
}
@@ -370,6 +380,8 @@ NvCtrlNvmlAttributes *NvCtrlInitNvmlAttr
void NvCtrlNvmlAttributesClose(NvCtrlAttributePrivateHandle *h)
{
+#ifdef NVML_AVAILABLE
+
     /* Check parameters */
     if (h == NULL || h->nvml == NULL) {
         return;
@@ -379,6 +391,8 @@ void NvCtrlNvmlAttributesClose(NvCtrlAtt
     free(h->nvml->coolerCountPerGPU);
     free(h->nvml);
     h->nvml = NULL;
+
+#endif
}
@@ -390,6 +404,8 @@ void NvCtrlNvmlAttributesClose(NvCtrlAtt
ReturnStatus NvCtrlNvmlQueryTargetCount(const CtrlTarget *ctrl_target,
                                         int target_type, int *val)
{
+#ifdef NVML_AVAILABLE
+
     const NvCtrlAttributePrivateHandle *h = getPrivateHandleConst(ctrl_target);
     if (!__isNvmlLoaded) {
@@ -422,6 +438,10 @@ ReturnStatus NvCtrlNvmlQueryTargetCount(
     }
     return NvCtrlSuccess;
+
+#else
+    return NvCtrlMissingExtension;
+#endif
}
@@ -430,7 +450,7 @@ ReturnStatus NvCtrlNvmlQueryTargetCount(
  * Get NVML String Attribute Values
  */
-#ifdef NVML_EXPERIMENTAL
+#ifdef NVML_AVAILABLE
static ReturnStatus NvCtrlNvmlGetGPUStringAttribute(const CtrlTarget *ctrl_target,
                                                     int attr, char **ptr)
@@ -492,16 +512,17 @@ static ReturnStatus NvCtrlNvmlGetGPUStri
     return NvCtrlNotSupported;
}
-#endif // NVML_EXPERIMENTAL
+#endif // NVML_AVAILABLE
ReturnStatus NvCtrlNvmlGetStringAttribute(const CtrlTarget *ctrl_target,
                                           int attr, char **ptr)
{
+#ifdef NVML_AVAILABLE
+
     if (!__isNvmlLoaded) {
         return NvCtrlMissingExtension;
     }
-#ifdef NVML_EXPERIMENTAL
     /*
      * This should't be reached for target types that are not handled through
      * NVML (Keep TARGET_TYPE_IS_NVML_COMPATIBLE in NvCtrlAttributesPrivate.h up
@@ -532,7 +553,7 @@ ReturnStatus NvCtrlNvmlGetStringAttribut
     }
#else
-    return NvCtrlNotSupported;
+    return NvCtrlMissingExtension;
#endif
}
@@ -542,7 +563,7 @@ ReturnStatus NvCtrlNvmlGetStringAttribut
  * Set NVML String Attribute Values
  */
-#ifdef NVML_EXPERIMENTAL
+#ifdef NVML_AVAILABLE
static ReturnStatus NvCtrlNvmlSetGPUStringAttribute(CtrlTarget *ctrl_target,
                                                     int attr, const char *ptr)
@@ -583,16 +604,17 @@ static ReturnStatus NvCtrlNvmlSetGPUStri
     return NvCtrlNotSupported;
}
-#endif // NVML_EXPERIMENTAL
+#endif // NVML_AVAILABLE
ReturnStatus NvCtrlNvmlSetStringAttribute(CtrlTarget *ctrl_target,
                                           int attr, const char *ptr)
{
+#ifdef NVML_AVAILABLE
+
     if (!__isNvmlLoaded) {
         return NvCtrlMissingExtension;
     }
-#ifdef NVML_EXPERIMENTAL
     /*
      * This should't be reached for target types that are not handled through
      * NVML (Keep TARGET_TYPE_IS_NVML_COMPATIBLE in NvCtrlAttributesPrivate.h up
@@ -624,7 +646,7 @@ ReturnStatus NvCtrlNvmlSetStringAttribut
     }
#else
-    return NvCtrlNotSupported;
+    return NvCtrlMissingExtension;
#endif
}
@@ -634,6 +656,8 @@ ReturnStatus NvCtrlNvmlSetStringAttribut
  * Get NVML Attribute Values
  */
+#ifdef NVML_AVAILABLE
+
static ReturnStatus NvCtrlNvmlGetGPUAttribute(const CtrlTarget *ctrl_target,
                                               int attr, int64_t *val)
{
@@ -649,7 +673,6 @@ static ReturnStatus NvCtrlNvmlGetGPUAttr
     ret = nvmlDeviceGetHandleByIndex(h->nvml->deviceIdx, &device);
     if (ret == NVML_SUCCESS) {
         switch (attr) {
-#ifdef NVML_EXPERIMENTAL
             case NV_CTRL_TOTAL_DEDICATED_GPU_MEMORY:
             case NV_CTRL_USED_DEDICATED_GPU_MEMORY:
                 {
@@ -714,17 +737,7 @@ static ReturnStatus NvCtrlNvmlGetGPUAttr
             case NV_CTRL_GPU_PCIE_MAX_LINK_WIDTH:
                 ret = nvmlDeviceGetMaxPcieLinkWidth(device, &res);
                 break;
-#else
-            case NV_CTRL_TOTAL_DEDICATED_GPU_MEMORY:
-            case NV_CTRL_USED_DEDICATED_GPU_MEMORY:
-            case NV_CTRL_PCI_DOMAIN:
-            case NV_CTRL_PCI_BUS:
-            case NV_CTRL_PCI_DEVICE:
-            case NV_CTRL_PCI_FUNCTION:
-            case NV_CTRL_PCI_ID:
-            case NV_CTRL_GPU_PCIE_GENERATION:
-            case NV_CTRL_GPU_PCIE_MAX_LINK_WIDTH:
-#endif // NVML_EXPERIMENTAL
+
             case NV_CTRL_VIDEO_RAM:
             case NV_CTRL_GPU_PCIE_CURRENT_LINK_WIDTH:
             case NV_CTRL_GPU_PCIE_MAX_LINK_SPEED:
@@ -790,14 +803,6 @@ static ReturnStatus NvCtrlNvmlGetGPUAttr
                  */
                 return NvCtrlNotSupported;
-            case NV_CTRL_ATTR_NVML_GPU_VIRTUALIZATION_MODE:
-                {
-                    nvmlGpuVirtualizationMode_t mode;
-                    ret = nvmlDeviceGetVirtualizationMode(device, &mode);
-                    res = mode;
-                }
-                break;
-
             default:
                 /* Did we forget to handle a GPU integer attribute? */
                 nv_warning_msg("Unhandled integer attribute %s (%d) of GPU "
@@ -817,8 +822,6 @@ static ReturnStatus NvCtrlNvmlGetGPUAttr
     return NvCtrlNotSupported;
}
-#ifdef NVML_EXPERIMENTAL
-
static int getThermalCoolerId(const NvCtrlAttributePrivateHandle *h,
                               unsigned int thermalCoolerCount,
                               const unsigned int *thermalCoolerCountPerGPU)
@@ -953,11 +956,14 @@ static ReturnStatus NvCtrlNvmlGetCoolerA
     printNvmlError(ret);
     return NvCtrlNotSupported;
}
-#endif // NVML_EXPERIMENTAL
+
+#endif // NVML_AVAILABLE
ReturnStatus NvCtrlNvmlGetAttribute(const CtrlTarget *ctrl_target,
                                     int attr, int64_t *val)
{
+#ifdef NVML_AVAILABLE
+
     if (!__isNvmlLoaded) {
         return NvCtrlMissingExtension;
     }
@@ -972,19 +978,17 @@ ReturnStatus NvCtrlNvmlGetAttribute(cons
     switch (NvCtrlGetTargetType(ctrl_target)) {
         case GPU_TARGET:
             return NvCtrlNvmlGetGPUAttribute(ctrl_target, attr, val);
-#ifdef NVML_EXPERIMENTAL
         case THERMAL_SENSOR_TARGET:
             return NvCtrlNvmlGetThermalAttribute(ctrl_target, attr, val);
         case COOLER_TARGET:
             return NvCtrlNvmlGetCoolerAttribute(ctrl_target, attr, val);
-#else
-        case THERMAL_SENSOR_TARGET:
-        case COOLER_TARGET:
-            return NvCtrlNotSupported;
-#endif
         default:
             return NvCtrlBadHandle;
     }
+
+#else
+    return NvCtrlMissingExtension;
+#endif
}
@@ -993,7 +997,7 @@ ReturnStatus NvCtrlNvmlGetAttribute(cons
  * Set NVML Attribute Values
  */
-#ifdef NVML_EXPERIMENTAL
+#ifdef NVML_AVAILABLE
static ReturnStatus NvCtrlNvmlSetGPUAttribute(CtrlTarget *ctrl_target,
                                               int attr, int index, int val)
@@ -1093,16 +1097,17 @@ static ReturnStatus NvCtrlNvmlSetCoolerA
     return NvCtrlNotSupported;
}
-#endif // NVML_EXPERIMENTAL
+#endif // NVML_AVAILABLE
ReturnStatus NvCtrlNvmlSetAttribute(CtrlTarget *ctrl_target, int attr,
                                     int index, int val)
{
+#ifdef NVML_AVAILABLE
+
     if (!__isNvmlLoaded) {
         return NvCtrlMissingExtension;
     }
-#ifdef NVML_EXPERIMENTAL
     /*
      * This should't be reached for target types that are not handled through
      * NVML (Keep TARGET_TYPE_IS_NVML_COMPATIBLE in NvCtrlAttributesPrivate.h up
@@ -1128,7 +1133,7 @@ ReturnStatus NvCtrlNvmlSetAttribute(Ctrl
     }
#else
-    return NvCtrlNotSupported;
+    return NvCtrlMissingExtension;
#endif
}
@@ -1138,7 +1143,7 @@ ReturnStatus NvCtrlNvmlSetAttribute(Ctrl
  * Get NVML Binary Attribute Values
  */
-#ifdef NVML_EXPERIMENTAL
+#ifdef NVML_AVAILABLE
static ReturnStatus
NvCtrlNvmlGetGPUBinaryAttribute(const CtrlTarget *ctrl_target,
@@ -1187,17 +1192,18 @@ NvCtrlNvmlGetGPUBinaryAttribute(const Ct
     return NvCtrlNotSupported;
}
-#endif // NVML_EXPERIMENTAL
+#endif // NVML_AVAILABLE
ReturnStatus
NvCtrlNvmlGetBinaryAttribute(const CtrlTarget *ctrl_target,
                              int attr, unsigned char **data, int *len)
{
+#ifdef NVML_AVAILABLE
+
     if (!__isNvmlLoaded) {
         return NvCtrlMissingExtension;
     }
-#ifdef NVML_EXPERIMENTAL
     /*
      * This should't be reached for target types that are not handled through
      * NVML (Keep TARGET_TYPE_IS_NVML_COMPATIBLE in NvCtrlAttributesPrivate.h up
@@ -1231,7 +1237,7 @@ NvCtrlNvmlGetBinaryAttribute(const CtrlT
     }
#else
-    return NvCtrlNotSupported;
+    return NvCtrlMissingExtension;
#endif
}
@@ -1241,7 +1247,7 @@ NvCtrlNvmlGetBinaryAttribute(const CtrlT
  * Get NVML Valid String Attribute Values
  */
-#ifdef NVML_EXPERIMENTAL
+#ifdef NVML_AVAILABLE
static ReturnStatus
NvCtrlNvmlGetGPUValidStringAttributeValues(int attr,
@@ -1273,19 +1279,20 @@ NvCtrlNvmlGetGPUValidStringAttributeValu
     return NvCtrlSuccess;
}
-#endif // NVML_EXPERIMENTAL
+#endif // NVML_AVAILABLE
ReturnStatus
NvCtrlNvmlGetValidStringAttributeValues(const CtrlTarget *ctrl_target,
                                         int attr,
                                         CtrlAttributeValidValues *val)
{
+#ifdef NVML_AVAILABLE
+    ReturnStatus ret;
+
     if (!__isNvmlLoaded) {
         return NvCtrlMissingExtension;
     }
-#ifdef NVML_EXPERIMENTAL
-    ReturnStatus ret;
     /*
      * This should't be reached for target types that are not handled through
      * NVML (Keep TARGET_TYPE_IS_NVML_COMPATIBLE in NvCtrlAttributesPrivate.h up
@@ -1332,7 +1339,7 @@ NvCtrlNvmlGetValidStringAttributeValues(
     return ret;
#else
-    return NvCtrlNotSupported;
+    return NvCtrlMissingExtension;
#endif
}
@@ -1342,7 +1349,7 @@ NvCtrlNvmlGetValidStringAttributeValues(
  * Get NVML Valid Attribute Values
  */
-#ifdef NVML_EXPERIMENTAL
+#ifdef NVML_AVAILABLE
static ReturnStatus
NvCtrlNvmlGetGPUValidAttributeValues(const CtrlTarget *ctrl_target, int attr,
@@ -1547,19 +1554,20 @@ NvCtrlNvmlGetCoolerValidAttributeValues(
     return NvCtrlNotSupported;
}
-#endif // NVML_EXPERIMENTAL
+#endif // NVML_AVAILABLE
ReturnStatus
NvCtrlNvmlGetValidAttributeValues(const CtrlTarget *ctrl_target,
                                   int attr,
                                   CtrlAttributeValidValues *val)
{
+#ifdef NVML_AVAILABLE
+    ReturnStatus ret;
+
     if (!__isNvmlLoaded) {
         return NvCtrlMissingExtension;
     }
-#ifdef NVML_EXPERIMENTAL
-    ReturnStatus ret;
     /*
      * This should't be reached for target types that are not handled through
      * NVML (Keep TARGET_TYPE_IS_NVML_COMPATIBLE in NvCtrlAttributesPrivate.h up
@@ -1613,7 +1621,7 @@ NvCtrlNvmlGetValidAttributeValues(const
     return ret;
#else
-        return NvCtrlNotSupported;
+    return NvCtrlMissingExtension;
#endif
}
 
Du wirst ja noch zu einem richtigen Hacker, @Fusselbär :)

Wenn ich das näher erläutere, wie es zu diesem Patch kommt, glaubst Du das nicht. Es war eigentlich sehr einfach. Nach dem ich die Idee hatte, war der Rest Port Automagie, genauer:
Code:
make makepatch
Ja und das src/libXNVCtrlAttributes/NvCtrlAttributesNvml.c von den nvidia-settings 367.57. So einfach war das. :)
 
  • Like
Reaktionen: lme
Ja, die Funktion an sich, zum setzen in der xorg.conf gibt es schon lange. Aber nun kann man diese Funktion bequem und bedarfsgerecht in den nvidia-settings 375.10 ein- und ausschalten. Also etwa nur dann einschalten, wenn Tearing auch tatsächlich mal auftritt. Auf meinem Desktop brauche ich das zum Beispiel nicht, da spürte ich hingegen mit eingeschaltetem ForceFullCompositionPipeline Verzögerungen, etwa beim öffnen des KDE Startmenüs oder beim starten vom Firefox. So mit der Einschaltmöglichkeit in den nvidia-settings hingegen habe ich das bedarfsgerecht etwa bei diesem kurzem Video eingeschaltet:
Um diese Inhalte anzuzeigen, benötigen wir die Zustimmung zum Setzen von Drittanbieter-Cookies.
Für weitere Informationen siehe die Seite Verwendung von Cookies.
Beim Schwenk unter die Grafikkarte mit den drehenden Propellern kam es zu etwas Tearing, das war dann mit eingeschaltetem ForceFullCompositionPipeline weg.
Solches Tearing habe ich aber nicht bei jedem Video und es stört mich auch nicht immer, so dass ich nur im Fall dass es mich stört, dann das ForceFullCompositionPipeline einschalten möchte. Die Flinkheit meines Desktops ist mir ansonsten wichtiger. :)
 
Die nvidia-driver Version 375.20 ist am 18.11.2016 nun als Latest Long Lived Branch Version veröffentlicht worden:
http://www.nvidia.com/Download/driverResults.aspx/111597/en-us
Und da steht nun auch dabei:
Added support for FreeBSD 11.0-RELEASE.
Der Patch von oben aus dem Faden ist nicht mehr nötig, der nvml.h Header ist nun im nvidia-settings-375.20.tar.bz2 enthalten:
http://download.nvidia.com/XFree86/nvidia-settings/nvidia-settings-375.20.tar.bz2

Wer oben aber im Screenshot genau hingeschaut hat, sieht, dass ich dort GTK3 verwende. Das ist der Patch:
Code:
--- Makefile.orig       2016-11-19 19:17:23.176684000 +0100                                                                                                                                                                                                                  
+++ Makefile    2016-11-20 03:47:58.895810000 +0100                                                                                                                                                                                                                          
@@ -2,7 +2,7 @@                                                                                                                                                                                                                                                              
# $FreeBSD: head/x11/nvidia-settings/Makefile 412351 2016-04-01 14:33:55Z mat $                                                                                                                                                                                             
                                                                                                                                                                                                                                                                             
PORTNAME=      nvidia-settings                                                                                                                                                                                                                                              
-PORTVERSION=   355.11                                                                                                                                                                                                                                                       
+PORTVERSION=    375.20
PORTREVISION=  3
CATEGORIES=    x11
@@ -18,22 +18,27 @@
GH_ACCOUNT=    NVIDIA
USE_GNOME=     gtk20
-USES=          gmake pkgconfig
+USES=          gmake pkgconfig tar:bzip2 libtool
USE_GL=                gl
USE_XORG=      xext xv
+USE_LDCONFIG=   yes
PLIST_FILES=   bin/nvidia-settings \
                man/man1/nvidia-settings.1.gz \
                lib/libnvidia-gtk2.so.${PORTVERSION} \
+                lib/libnvidia-gtk3.so.${PORTVERSION} \
                share/applications/nvidia-settings.desktop \
                share/pixmaps/nvidia-settings.png
-LDFLAGS+=      -pthread
+CONFIGURE_ENV+=        MISSING=${TRUE} LIBS=${PTHREAD_LIBS}
+NVTHREADS_CFLAGS+=      ${PTHREAD_CFLAGS}
+NVTHREADS_LDFLAGS+=     ${PTHREAD_LIBS}
+LDFLAGS+=      -Wl,--as-needed -pthread
MAKE_ENV=      NV_USE_BUNDLED_LIBJANSSON=0 \
                NV_VERBOSE= \
-               STRIP_CMD=${TRUE} \
                INSTALL_BIN_ARGS="${INSTALL_PROGRAM:Ninstall}" \
                INSTALL_DOC_ARGS="${INSTALL_MAN:Ninstall}" \
+                INSTALL_LIB_ARGS="${INSTALL_LIB:Ninstall}" \
                X_CFLAGS=-I${LOCALBASE}/include \
                X_LDFLAGS=-L${LOCALBASE}/lib
@@ -47,7 +52,8 @@
                ${WRKSRC}/src/gtk+-2.x/ctkappprofile.c
post-install:  .SILENT
-       ${STRIP_CMD} ${STAGEDIR}${PREFIX}/lib/libnvidia-gtk2.so.${PORTVERSION}
+       ${STRIP_CMD} ${STAGEDIR}${PREFIX}/lib/libnvidia-gtk2.so.${PORTVERSION} \
+                ${STAGEDIR}${PREFIX}/lib/libnvidia-gtk3.so.${PORTVERSION}
        ${INSTALL_DATA} ${WRKSRC}/doc/nvidia-settings.desktop \
                ${STAGEDIR}/${DESKTOPDIR}
        ${INSTALL_DATA} ${WRKSRC}/doc/nvidia-settings.png \
Das Sourcecodepäckchen ist aber noch nicht über Githubs Codeload zu bekommen, auf Github gibt es bislang noch 375.10:
https://github.com/NVIDIA/nvidia-settings
Ich habe das Archiv händisch vom Nvidia Download Server geladen, dann passend für die Ports benannt und zu den distfiles geschubst.

Für nvidia-xconfig habe ich auch einen Patch:
Code:
--- Makefile.orig       2016-11-19 19:17:23.154541000 +0100
+++ Makefile    2016-11-20 04:15:42.064321000 +0100
@@ -2,7 +2,7 @@
# $FreeBSD: head/x11/nvidia-xconfig/Makefile 419106 2016-07-26 13:11:40Z bland $
PORTNAME=      nvidia-xconfig
-PORTVERSION=   367.35
+PORTVERSION=    375.20
CATEGORIES=    x11
MAINTAINER=    bland@FreeBSD.org
@@ -16,10 +16,12 @@
USES=          gmake
+CONFIGURE_ENV+=        MISSING=${TRUE} LIBS=${PTHREAD_LIBS}
MAKE_ENV=      NV_VERBOSE= \
                INSTALL_PROGRAM="${INSTALL_PROGRAM}" \
                INSTALL_MAN="${INSTALL_MAN}" \
                prefix=${PREFIX}
+LDFLAGS+=       -Wl,--as-needed -pthread
PLIST_FILES=   bin/nvidia-xconfig \
                man/man1/nvidia-xconfig.1.gz
Das läuft schon so seit einigen Monaten mit den Patches für threads stabil bei mir hier.
 
Hallo @Fusselbär

danke für Deine Bemühungen um Nvidia-Treiber und weitere relevante Software zur Konfiguration von Nvidia-Karten.

Eine kleine Frage, da ich sehe, dass Du auch nividia-xconfig gepatcht hast:
Ist dieses Paket notwendig? Ich habe mal im FreeBSD-Forum eine Anleitung gefunden, die ich unter FreeBSD auch nutze und die ich ähnlich auch aus dem Handbuch zu siduction für GNU/Linux her kenne:
Den Treiber installieren, und dann eine 10-nvidia.conf erstellen in /usr/local/etc/X11/xorg.conf.d mit dem Inhalt
Code:
Section "Device"
        Identifier      "NVIDIA Card"
        VendorName      "NVIDIA Corporation"
        Driver          "nvidia"
EndSection

Neustart, und dat Ding löppet.

Oder entgeht mir da etwas und es ist besser, nvidia-xconfig machen zu lassen?

Sorry wegen des halben @OffTopic.

Viele Grüße,
Holger
 
nvidia-xconfig ist vor allem dazu da, um das Setup auf ein Kommando zu reduzieren. Man braucht das Tool nicht zwingend, vor allem nicht, wenn man eine Config hat, die man durch die Gegend kopieren kann.
 
Zurück
Oben