Bladeren bron

Add F_r32i texture format (useful for atomic image writes from shaders)

rdb 11 jaren geleden
bovenliggende
commit
0e1f261ca5
3 gewijzigde bestanden met toevoegingen van 42 en 0 verwijderingen
  1. 14 0
      panda/src/glstuff/glGraphicsStateGuardian_src.cxx
  2. 25 0
      panda/src/gobj/texture.cxx
  3. 3 0
      panda/src/gobj/texture.h

+ 14 - 0
panda/src/glstuff/glGraphicsStateGuardian_src.cxx

@@ -4774,6 +4774,9 @@ framebuffer_copy_to_ram(Texture *tex, int view, int z,
     case GL_FLOAT:
       GLCAT.spam(false) << "GL_FLOAT";
       break;
+    case GL_INT:
+      GLCAT.spam(false) << "GL_INT";
+      break;
     default:
       GLCAT.spam(false) << "unknown";
       break;
@@ -6545,6 +6548,8 @@ get_component_type(Texture::ComponentType component_type) {
     } else {
       return GL_UNSIGNED_BYTE;
     }
+  case Texture::T_int:
+    return GL_INT;
   default:
     GLCAT.error() << "Invalid Texture::Type value!\n";
     return GL_UNSIGNED_BYTE;
@@ -6756,6 +6761,8 @@ get_external_image_format(Texture *tex) const {
   case Texture::F_luminance_alpha:
   case Texture::F_sluminance_alpha:
     return GL_LUMINANCE_ALPHA;
+  case Texture::F_r32i:
+    return GL_RED_INTEGER;
   }
   GLCAT.error()
     << "Invalid Texture::Format value in get_external_image_format(): "
@@ -7153,6 +7160,9 @@ get_internal_image_format(Texture *tex) const {
   case Texture::F_sluminance_alpha:
     return GL_SLUMINANCE8_ALPHA8;
 
+  case Texture::F_r32i:
+    return GL_R32I;
+
   default:
     GLCAT.error()
       << "Invalid image format in get_internal_image_format(): "
@@ -10306,6 +10316,10 @@ do_extract_texture_data(CLP(TextureContext) *gtc) {
     format = Texture::F_red;
     break;
 #endif
+  case GL_R32I:
+    format = Texture::F_r32i;
+    break;
+
 #ifndef OPENGLES
   case GL_RED:
     format = Texture::F_red;

+ 25 - 0
panda/src/gobj/texture.cxx

@@ -581,6 +581,10 @@ estimate_texture_memory() const {
     bpp = 6;
     break;
 
+  case Texture::F_r32i:
+    bpp = 4;
+    break;
+
   default:
     break;
   }
@@ -1597,6 +1601,10 @@ write(ostream &out, int indent_level) const {
     out << " floats";
     break;
 
+  case T_int:
+    out << " ints";
+    break;
+
   default:
     break;
   }
@@ -1707,6 +1715,10 @@ write(ostream &out, int indent_level) const {
   case F_sluminance_alpha:
     out << "sluminance_alpha";
     break;
+
+  case F_r32i:
+    out << "r32i";
+    break;
   }
 
   if (cdata->_compression != CM_default) {
@@ -2034,6 +2046,8 @@ format_component_type(ComponentType ct) {
     return "float";
   case T_unsigned_int_24_8:
     return "unsigned_int_24_8";
+  case T_int:
+    return "int";
   }
 
   return "**invalid**";
@@ -2055,6 +2069,8 @@ string_component_type(const string &str) {
     return T_float;
   } else if (cmp_nocase(str, "unsigned_int_24_8") == 0) {
     return T_unsigned_int_24_8;
+  } else if (cmp_nocase(str, "int") == 0) {
+    return T_int;
   }
 
   gobj_cat->error()
@@ -2137,6 +2153,8 @@ format_format(Format format) {
     return "sluminance";
   case F_sluminance_alpha:
     return "sluminance_alpha";
+  case F_r32i:
+    return "r32i";
   }
   return "**invalid**";
 }
@@ -2215,6 +2233,8 @@ string_format(const string &str) {
     return F_sluminance;
   } else if (cmp_nocase(str, "sluminance_alpha") == 0) {
     return F_sluminance_alpha;
+  } else if (cmp_nocase(str, "r32i") == 0) {
+    return F_r32i;
   }
 
   gobj_cat->error()
@@ -5060,6 +5080,7 @@ do_set_format(CData *cdata, Texture::Format format) {
   case F_luminance:
   case F_r16:
   case F_sluminance:
+  case F_r32i:
     cdata->_num_components = 1;
     break;
 
@@ -5119,6 +5140,10 @@ do_set_component_type(CData *cdata, Texture::ComponentType component_type) {
   case T_unsigned_int_24_8:
     cdata->_component_width = 4;
     break;
+
+  case T_int:
+    cdata->_component_width = 4;
+    break;
   }
 }
 

+ 3 - 0
panda/src/gobj/texture.h

@@ -86,6 +86,7 @@ PUBLISHED:
     T_unsigned_short,
     T_float,
     T_unsigned_int_24_8,
+    T_int,
   };
 
   enum Format {
@@ -139,6 +140,8 @@ PUBLISHED:
     F_srgb_alpha,
     F_sluminance,
     F_sluminance_alpha,
+
+    F_r32i,  // 32-bit integer, used for atomic access
   };
 
   enum FilterType {