diff options
Diffstat (limited to 'src/share/native/sun/java2d/ShaderList.c')
-rw-r--r-- | src/share/native/sun/java2d/ShaderList.c | 143 |
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; +} |