⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 brw_draw_upload.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 2 页
字号:
/************************************************************************** *  * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. * All Rights Reserved. *  * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sub license, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: *  * The above copyright notice and this permission notice (including the * next paragraph) shall be included in all copies or substantial portions * of the Software. *  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *  **************************************************************************/#include <stdlib.h>#include "glheader.h"#include "context.h"#include "state.h"#include "api_validate.h"#include "enums.h"#include "brw_draw.h"#include "brw_defines.h"#include "brw_context.h"#include "brw_state.h"#include "brw_fallback.h"#include "intel_ioctl.h"#include "intel_batchbuffer.h"#include "intel_buffer_objects.h"#include "intel_tex.h"static GLuint double_types[5] = {   0,   BRW_SURFACEFORMAT_R64_FLOAT,   BRW_SURFACEFORMAT_R64G64_FLOAT,   BRW_SURFACEFORMAT_R64G64B64_FLOAT,   BRW_SURFACEFORMAT_R64G64B64A64_FLOAT};static GLuint float_types[5] = {   0,   BRW_SURFACEFORMAT_R32_FLOAT,   BRW_SURFACEFORMAT_R32G32_FLOAT,   BRW_SURFACEFORMAT_R32G32B32_FLOAT,   BRW_SURFACEFORMAT_R32G32B32A32_FLOAT};static GLuint uint_types_norm[5] = {   0,   BRW_SURFACEFORMAT_R32_UNORM,   BRW_SURFACEFORMAT_R32G32_UNORM,   BRW_SURFACEFORMAT_R32G32B32_UNORM,   BRW_SURFACEFORMAT_R32G32B32A32_UNORM};static GLuint uint_types_scale[5] = {   0,   BRW_SURFACEFORMAT_R32_USCALED,   BRW_SURFACEFORMAT_R32G32_USCALED,   BRW_SURFACEFORMAT_R32G32B32_USCALED,   BRW_SURFACEFORMAT_R32G32B32A32_USCALED};static GLuint int_types_norm[5] = {   0,   BRW_SURFACEFORMAT_R32_SNORM,   BRW_SURFACEFORMAT_R32G32_SNORM,   BRW_SURFACEFORMAT_R32G32B32_SNORM,   BRW_SURFACEFORMAT_R32G32B32A32_SNORM};static GLuint int_types_scale[5] = {   0,   BRW_SURFACEFORMAT_R32_SSCALED,   BRW_SURFACEFORMAT_R32G32_SSCALED,   BRW_SURFACEFORMAT_R32G32B32_SSCALED,   BRW_SURFACEFORMAT_R32G32B32A32_SSCALED};static GLuint ushort_types_norm[5] = {   0,   BRW_SURFACEFORMAT_R16_UNORM,   BRW_SURFACEFORMAT_R16G16_UNORM,   BRW_SURFACEFORMAT_R16G16B16_UNORM,   BRW_SURFACEFORMAT_R16G16B16A16_UNORM};static GLuint ushort_types_scale[5] = {   0,   BRW_SURFACEFORMAT_R16_USCALED,   BRW_SURFACEFORMAT_R16G16_USCALED,   BRW_SURFACEFORMAT_R16G16B16_USCALED,   BRW_SURFACEFORMAT_R16G16B16A16_USCALED};static GLuint short_types_norm[5] = {   0,   BRW_SURFACEFORMAT_R16_SNORM,   BRW_SURFACEFORMAT_R16G16_SNORM,   BRW_SURFACEFORMAT_R16G16B16_SNORM,   BRW_SURFACEFORMAT_R16G16B16A16_SNORM};static GLuint short_types_scale[5] = {   0,   BRW_SURFACEFORMAT_R16_SSCALED,   BRW_SURFACEFORMAT_R16G16_SSCALED,   BRW_SURFACEFORMAT_R16G16B16_SSCALED,   BRW_SURFACEFORMAT_R16G16B16A16_SSCALED};static GLuint ubyte_types_norm[5] = {   0,   BRW_SURFACEFORMAT_R8_UNORM,   BRW_SURFACEFORMAT_R8G8_UNORM,   BRW_SURFACEFORMAT_R8G8B8_UNORM,   BRW_SURFACEFORMAT_R8G8B8A8_UNORM};static GLuint ubyte_types_scale[5] = {   0,   BRW_SURFACEFORMAT_R8_USCALED,   BRW_SURFACEFORMAT_R8G8_USCALED,   BRW_SURFACEFORMAT_R8G8B8_USCALED,   BRW_SURFACEFORMAT_R8G8B8A8_USCALED};static GLuint byte_types_norm[5] = {   0,   BRW_SURFACEFORMAT_R8_SNORM,   BRW_SURFACEFORMAT_R8G8_SNORM,   BRW_SURFACEFORMAT_R8G8B8_SNORM,   BRW_SURFACEFORMAT_R8G8B8A8_SNORM};static GLuint byte_types_scale[5] = {   0,   BRW_SURFACEFORMAT_R8_SSCALED,   BRW_SURFACEFORMAT_R8G8_SSCALED,   BRW_SURFACEFORMAT_R8G8B8_SSCALED,   BRW_SURFACEFORMAT_R8G8B8A8_SSCALED};static GLuint get_surface_type( GLenum type, GLuint size, GLboolean normalized ){   if (INTEL_DEBUG & DEBUG_VERTS)      _mesa_printf("type %s size %d normalized %d\n", 		   _mesa_lookup_enum_by_nr(type), size, normalized);   if (normalized) {      switch (type) {      case GL_DOUBLE: return double_types[size];      case GL_FLOAT: return float_types[size];      case GL_INT: return int_types_norm[size];      case GL_SHORT: return short_types_norm[size];      case GL_BYTE: return byte_types_norm[size];      case GL_UNSIGNED_INT: return uint_types_norm[size];      case GL_UNSIGNED_SHORT: return ushort_types_norm[size];      case GL_UNSIGNED_BYTE: return ubyte_types_norm[size];      default: assert(0); return 0;      }         }   else {      switch (type) {      case GL_DOUBLE: return double_types[size];      case GL_FLOAT: return float_types[size];      case GL_INT: return int_types_scale[size];      case GL_SHORT: return short_types_scale[size];      case GL_BYTE: return byte_types_scale[size];      case GL_UNSIGNED_INT: return uint_types_scale[size];      case GL_UNSIGNED_SHORT: return ushort_types_scale[size];      case GL_UNSIGNED_BYTE: return ubyte_types_scale[size];      default: assert(0); return 0;      }         }}static GLuint get_size( GLenum type ){   switch (type) {   case GL_DOUBLE: return sizeof(GLdouble);   case GL_FLOAT: return sizeof(GLfloat);   case GL_INT: return sizeof(GLint);   case GL_SHORT: return sizeof(GLshort);   case GL_BYTE: return sizeof(GLbyte);   case GL_UNSIGNED_INT: return sizeof(GLuint);   case GL_UNSIGNED_SHORT: return sizeof(GLushort);   case GL_UNSIGNED_BYTE: return sizeof(GLubyte);   default: return 0;   }      }static GLuint get_index_type(GLenum type) {   switch (type) {   case GL_UNSIGNED_BYTE:  return BRW_INDEX_BYTE;   case GL_UNSIGNED_SHORT: return BRW_INDEX_WORD;   case GL_UNSIGNED_INT:   return BRW_INDEX_DWORD;   default: assert(0); return 0;   }}static void wrap_buffers( struct brw_context *brw,			  GLuint size ){   if (size < BRW_UPLOAD_INIT_SIZE)      size = BRW_UPLOAD_INIT_SIZE;   brw->vb.upload.offset = 0;   if (brw->vb.upload.bo != NULL)      dri_bo_unreference(brw->vb.upload.bo);   brw->vb.upload.bo = dri_bo_alloc(brw->intel.bufmgr, "temporary VBO",				    size, 1,				    DRM_BO_FLAG_MEM_LOCAL |				    DRM_BO_FLAG_CACHED |				    DRM_BO_FLAG_CACHED_MAPPED);   /* Set the internal VBO\ to no-backing-store.  We only use them as a    * temporary within a brw_try_draw_prims while the lock is held.    */   /* DON'T DO THIS AS IF WE HAVE TO RE-ORG MEMORY WE NEED SOMEWHERE WITH      FAKE TO PUSH THIS STUFF *///   if (!brw->intel.ttm)//      dri_bo_fake_disable_backing_store(brw->vb.upload.bo, NULL, NULL);}static void get_space( struct brw_context *brw,		       GLuint size,		       dri_bo **bo_return,		       GLuint *offset_return ){   size = ALIGN(size, 64);   if (brw->vb.upload.bo == NULL ||       brw->vb.upload.offset + size > brw->vb.upload.bo->size) {      wrap_buffers(brw, size);   }   dri_bo_reference(brw->vb.upload.bo);   *bo_return = brw->vb.upload.bo;   *offset_return = brw->vb.upload.offset;   brw->vb.upload.offset += size;}static voidcopy_array_to_vbo_array( struct brw_context *brw,			 struct brw_vertex_element *element,			 GLuint dst_stride){   GLuint size = element->count * dst_stride;   get_space(brw, size, &element->bo, &element->offset);   if (element->glarray->StrideB == 0) {      assert(element->count == 1);      element->stride = 0;   } else {      element->stride = dst_stride;   }   if (dst_stride == element->glarray->StrideB) {      dri_bo_subdata(element->bo,		     element->offset,		     size,		     element->glarray->Ptr);   } else {      void *data;      char *dest;      const char *src = element->glarray->Ptr;      int i;      data = _mesa_malloc(dst_stride * element->count);      dest = data;      for (i = 0; i < element->count; i++) {	 memcpy(dest, src, dst_stride);	 src += element->glarray->StrideB;	 dest += dst_stride;      }      dri_bo_subdata(element->bo,		     element->offset,		     size,		     data);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -