mirror of
https://github.com/openjdk/jdk.git
synced 2026-02-14 20:35:09 +00:00
Forward port of the new Direct3D 9 rendering pipeline from 6u10. Also includes fixes for 6690659 6689025 6658398 6596234. Reviewed-by: campbell, prr
144 lines
4.6 KiB
C
144 lines
4.6 KiB
C
/*
|
|
* 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;
|
|
}
|