jdk/src/java.desktop/windows/native/libawt/java2d/d3d/ShaderList.c
changeset 40156 5b4bb91fd355
parent 26751 70bac69b37c9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/src/java.desktop/windows/native/libawt/java2d/d3d/ShaderList.c	Thu Jul 28 09:54:55 2016 -0700
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 2007, 2008, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.  Oracle designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Oracle in the LICENSE file that accompanied this code.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+#include <malloc.h>
+#include <string.h>
+
+#include "ShaderList.h"
+#include "Trace.h"
+
+/**
+ * Creates a new ShaderInfo that wraps the given fragment program handle
+ * and related data and stores it at the front of the provided ShaderList.
+ * If the addition causes the ShaderList to outgrow its defined capacity,
+ * the least-recently used item in the list (including its fragment program
+ * object) will be disposed.
+ */
+void
+ShaderList_AddProgram(ShaderList *programList,
+                      jlong programID,
+                      jint compType, jint compMode, jint flags)
+{
+    ShaderInfo *info;
+
+    J2dTraceLn(J2D_TRACE_INFO, "ShaderList_AddProgram");
+
+    // create new ShaderInfo
+    info = (ShaderInfo *)malloc(sizeof(ShaderInfo));
+    if (info == NULL) {
+        J2dTraceLn(J2D_TRACE_ERROR,
+                   "D3DContext_AddProgram: could not allocate ShaderInfo");
+        return;
+    }
+
+    // fill in the information
+    info->next = programList->head;
+    info->programID = programID;
+    info->compType = compType;
+    info->compMode = compMode;
+    info->flags = flags;
+
+    // insert it at the head of the list
+    programList->head = info;
+
+    // run through the list and see if we need to delete the least
+    // recently used item
+    {
+        int i = 1;
+        ShaderInfo *prev = NULL;
+        ShaderInfo *curr = info->next;
+        while (curr != NULL) {
+            if (i >= programList->maxItems) {
+                prev->next = NULL;
+                programList->dispose(curr->programID);
+                free(curr);
+                break;
+            }
+            i++;
+            prev = curr;
+            curr = curr->next;
+        }
+    }
+}
+
+/**
+ * Locates a fragment program handle given a list of shader programs
+ * (ShaderInfos), using the provided composite state and flags as search
+ * parameters.  The "flags" parameter is a bitwise-or'd value that helps
+ * differentiate one program for another; the interpretation of this value
+ * varies depending on the type of shader (BufImgOp, Paint, etc) but here
+ * it is only used to find another ShaderInfo with that same "flags" value.
+ * If no matching program can be located, this method returns 0.
+ */
+jlong
+ShaderList_FindProgram(ShaderList *programList,
+                       jint compType, jint compMode, jint flags)
+{
+    ShaderInfo *prev = NULL;
+    ShaderInfo *info = programList->head;
+
+    J2dTraceLn(J2D_TRACE_INFO, "ShaderList_FindProgram");
+
+    while (info != NULL) {
+        if (compType == info->compType &&
+            compMode == info->compMode &&
+            flags == info->flags)
+        {
+            // it's a match: move it to the front of the list (if it's not
+            // there already) and patch up the links
+            if (info != programList->head) {
+                prev->next = info->next;
+                info->next = programList->head;
+                programList->head = info;
+            }
+            return info->programID;
+        }
+        prev = info;
+        info = info->next;
+    }
+    return 0;
+}
+
+/**
+ * Disposes all entries (and their associated shader program objects)
+ * contained in the given ShaderList.
+ */
+void
+ShaderList_Dispose(ShaderList *programList)
+{
+    ShaderInfo *info = programList->head;
+
+    J2dTraceLn(J2D_TRACE_INFO, "ShaderList_Dispose");
+
+    while (info != NULL) {
+        ShaderInfo *tmp = info->next;
+        programList->dispose(info->programID);
+        free(info);
+        info = tmp;
+    }
+
+    programList->head = NULL;
+}