aboutsummaryrefslogtreecommitdiff
path: root/src/share/native/sun/java2d/ShaderList.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/share/native/sun/java2d/ShaderList.c')
-rw-r--r--src/share/native/sun/java2d/ShaderList.c143
1 files changed, 143 insertions, 0 deletions
diff --git a/src/share/native/sun/java2d/ShaderList.c b/src/share/native/sun/java2d/ShaderList.c
new file mode 100644
index 000000000..8831f2abd
--- /dev/null
+++ b/src/share/native/sun/java2d/ShaderList.c
@@ -0,0 +1,143 @@
+/*
+ * Copyright 2007-2008 Sun Microsystems, Inc. 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. Sun designates this
+ * particular file as subject to the "Classpath" exception as provided
+ * by Sun 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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.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,
+ "OGLContext_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;
+}