1 /* 2 * Copyright (C) 2013 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #ifndef ANDROID_RSCPPSTRUCTS_H 18 #define ANDROID_RSCPPSTRUCTS_H 19 20 #include "rsDefines.h" 21 #include "util/RefBase.h" 22 23 #include <pthread.h> 24 25 26 /** 27 * Every row in an RS allocation is guaranteed to be aligned by this amount, and 28 * every row in a user-backed allocation must be aligned by this amount. 29 */ 30 #define RS_CPU_ALLOCATION_ALIGNMENT 16 31 32 struct dispatchTable; 33 34 namespace android { 35 class Surface; 36 37 namespace RSC { 38 39 40 typedef void (*ErrorHandlerFunc_t)(uint32_t errorNum, const char *errorText); 41 typedef void (*MessageHandlerFunc_t)(uint32_t msgNum, const void *msgData, size_t msgLen); 42 43 class RS; 44 class BaseObj; 45 class Element; 46 class Type; 47 class Allocation; 48 class Script; 49 class ScriptC; 50 class Sampler; 51 52 /** 53 * Possible error codes used by RenderScript. Once a status other than RS_SUCCESS 54 * is returned, the RenderScript context is considered dead and cannot perform any 55 * additional work. 56 */ 57 enum RSError { 58 RS_SUCCESS = 0, ///< No error 59 RS_ERROR_INVALID_PARAMETER = 1, ///< An invalid parameter was passed to a function 60 RS_ERROR_RUNTIME_ERROR = 2, ///< The RenderScript driver returned an error; this is 61 ///< often indicative of a kernel that crashed 62 RS_ERROR_INVALID_ELEMENT = 3, ///< An invalid Element was passed to a function 63 RS_ERROR_MAX = 9999 64 65 }; 66 67 /** 68 * Flags that can control RenderScript behavior on a per-context level. 69 */ 70 enum RSInitFlags { 71 RS_INIT_SYNCHRONOUS = 1, ///< All RenderScript calls will be synchronous. May reduce latency. 72 RS_INIT_LOW_LATENCY = 2, ///< Prefer low latency devices over potentially higher throughput devices. 73 // Bitflag 4 is reserved for the context flag low power 74 RS_INIT_WAIT_FOR_ATTACH = 8, ///< Kernel execution will hold to give time for a debugger to be attached 75 RS_INIT_MAX = 16 76 }; 77 78 79 class Byte2 { 80 public: 81 int8_t x, y; 82 83 Byte2(int8_t initX, int8_t initY) 84 : x(initX), y(initY) {} 85 Byte2() : x(0), y(0) {} 86 }; 87 88 class Byte3 { 89 public: 90 int8_t x, y, z; 91 92 Byte3(int8_t initX, int8_t initY, int8_t initZ) 93 : x(initX), y(initY), z(initZ) {} 94 Byte3() : x(0), y(0), z(0) {} 95 }; 96 97 class Byte4 { 98 public: 99 int8_t x, y, z, w; 100 101 Byte4(int8_t initX, int8_t initY, int8_t initZ, int8_t initW) 102 : x(initX), y(initY), z(initZ), w(initW) {} 103 Byte4() : x(0), y(0), z(0), w(0) {} 104 }; 105 106 class UByte2 { 107 public: 108 uint8_t x, y; 109 110 UByte2(uint8_t initX, uint8_t initY) 111 : x(initX), y(initY) {} 112 UByte2() : x(0), y(0) {} 113 }; 114 115 class UByte3 { 116 public: 117 uint8_t x, y, z; 118 119 UByte3(uint8_t initX, uint8_t initY, uint8_t initZ) 120 : x(initX), y(initY), z(initZ) {} 121 UByte3() : x(0), y(0), z(0) {} 122 }; 123 124 class UByte4 { 125 public: 126 uint8_t x, y, z, w; 127 128 UByte4(uint8_t initX, uint8_t initY, uint8_t initZ, uint8_t initW) 129 : x(initX), y(initY), z(initZ), w(initW) {} 130 UByte4() : x(0), y(0), z(0), w(0) {} 131 }; 132 133 class Short2 { 134 public: 135 short x, y; 136 137 Short2(short initX, short initY) 138 : x(initX), y(initY) {} 139 Short2() : x(0), y(0) {} 140 }; 141 142 class Short3 { 143 public: 144 short x, y, z; 145 146 Short3(short initX, short initY, short initZ) 147 : x(initX), y(initY), z(initZ) {} 148 Short3() : x(0), y(0), z(0) {} 149 }; 150 151 class Short4 { 152 public: 153 short x, y, z, w; 154 155 Short4(short initX, short initY, short initZ, short initW) 156 : x(initX), y(initY), z(initZ), w(initW) {} 157 Short4() : x(0), y(0), z(0), w(0) {} 158 }; 159 160 class UShort2 { 161 public: 162 uint16_t x, y; 163 164 UShort2(uint16_t initX, uint16_t initY) 165 : x(initX), y(initY) {} 166 UShort2() : x(0), y(0) {} 167 }; 168 169 class UShort3 { 170 public: 171 uint16_t x, y, z; 172 173 UShort3(uint16_t initX, uint16_t initY, uint16_t initZ) 174 : x(initX), y(initY), z(initZ) {} 175 UShort3() : x(0), y(0), z(0) {} 176 }; 177 178 class UShort4 { 179 public: 180 uint16_t x, y, z, w; 181 182 UShort4(uint16_t initX, uint16_t initY, uint16_t initZ, uint16_t initW) 183 : x(initX), y(initY), z(initZ), w(initW) {} 184 UShort4() : x(0), y(0), z(0), w(0) {} 185 }; 186 187 class Int2 { 188 public: 189 int x, y; 190 191 Int2(int initX, int initY) 192 : x(initX), y(initY) {} 193 Int2() : x(0), y(0) {} 194 }; 195 196 class Int3 { 197 public: 198 int x, y, z; 199 200 Int3(int initX, int initY, int initZ) 201 : x(initX), y(initY), z(initZ) {} 202 Int3() : x(0), y(0), z(0) {} 203 }; 204 205 class Int4 { 206 public: 207 int x, y, z, w; 208 209 Int4(int initX, int initY, int initZ, int initW) 210 : x(initX), y(initY), z(initZ), w(initW) {} 211 Int4() : x(0), y(0), z(0), w(0) {} 212 }; 213 214 class UInt2 { 215 public: 216 uint32_t x, y; 217 218 UInt2(uint32_t initX, uint32_t initY) 219 : x(initX), y(initY) {} 220 UInt2() : x(0), y(0) {} 221 }; 222 223 class UInt3 { 224 public: 225 uint32_t x, y, z; 226 227 UInt3(uint32_t initX, uint32_t initY, uint32_t initZ) 228 : x(initX), y(initY), z(initZ) {} 229 UInt3() : x(0), y(0), z(0) {} 230 }; 231 232 class UInt4 { 233 public: 234 uint32_t x, y, z, w; 235 236 UInt4(uint32_t initX, uint32_t initY, uint32_t initZ, uint32_t initW) 237 : x(initX), y(initY), z(initZ), w(initW) {} 238 UInt4() : x(0), y(0), z(0), w(0) {} 239 }; 240 241 class Long2 { 242 public: 243 int64_t x, y; 244 245 Long2(int64_t initX, int64_t initY) 246 : x(initX), y(initY) {} 247 Long2() : x(0), y(0) {} 248 }; 249 250 class Long3 { 251 public: 252 int64_t x, y, z; 253 254 Long3(int64_t initX, int64_t initY, int64_t initZ) 255 : x(initX), y(initY), z(initZ) {} 256 Long3() : x(0), y(0), z(0) {} 257 }; 258 259 class Long4 { 260 public: 261 int64_t x, y, z, w; 262 263 Long4(int64_t initX, int64_t initY, int64_t initZ, int64_t initW) 264 : x(initX), y(initY), z(initZ), w(initW) {} 265 Long4() : x(0), y(0), z(0), w(0) {} 266 }; 267 268 class ULong2 { 269 public: 270 uint64_t x, y; 271 272 ULong2(uint64_t initX, uint64_t initY) 273 : x(initX), y(initY) {} 274 ULong2() : x(0), y(0) {} 275 }; 276 277 class ULong3 { 278 public: 279 uint64_t x, y, z; 280 281 ULong3(uint64_t initX, uint64_t initY, uint64_t initZ) 282 : x(initX), y(initY), z(initZ) {} 283 ULong3() : x(0), y(0), z(0) {} 284 }; 285 286 class ULong4 { 287 public: 288 uint64_t x, y, z, w; 289 290 ULong4(uint64_t initX, uint64_t initY, uint64_t initZ, uint64_t initW) 291 : x(initX), y(initY), z(initZ), w(initW) {} 292 ULong4() : x(0), y(0), z(0), w(0) {} 293 }; 294 295 class Float2 { 296 public: 297 float x, y; 298 299 Float2(float initX, float initY) 300 : x(initX), y(initY) {} 301 Float2() : x(0), y(0) {} 302 }; 303 304 class Float3 { 305 public: 306 float x, y, z; 307 308 Float3(float initX, float initY, float initZ) 309 : x(initX), y(initY), z(initZ) {} 310 Float3() : x(0.f), y(0.f), z(0.f) {} 311 }; 312 313 class Float4 { 314 public: 315 float x, y, z, w; 316 317 Float4(float initX, float initY, float initZ, float initW) 318 : x(initX), y(initY), z(initZ), w(initW) {} 319 Float4() : x(0.f), y(0.f), z(0.f), w(0.f) {} 320 }; 321 322 class Double2 { 323 public: 324 double x, y; 325 326 Double2(double initX, double initY) 327 : x(initX), y(initY) {} 328 Double2() : x(0), y(0) {} 329 }; 330 331 class Double3 { 332 public: 333 double x, y, z; 334 335 Double3(double initX, double initY, double initZ) 336 : x(initX), y(initY), z(initZ) {} 337 Double3() : x(0), y(0), z(0) {} 338 }; 339 340 class Double4 { 341 public: 342 double x, y, z, w; 343 344 Double4(double initX, double initY, double initZ, double initW) 345 : x(initX), y(initY), z(initZ), w(initW) {} 346 Double4() : x(0), y(0), z(0), w(0) {} 347 }; 348 349 /** 350 * The RenderScript context. This class controls initialization, resource management, and teardown. 351 */ 352 class RS : public android::RSC::LightRefBase<RS> { 353 354 public: 355 RS(); 356 virtual ~RS(); 357 358 /** 359 * Initializes a RenderScript context. A context must be initialized before it can be used. 360 * @param[in] name Directory name to be used by this context. This should be equivalent to 361 * Context.getCacheDir(). 362 * @param[in] flags Optional flags for this context. 363 * @return true on success 364 */ 365 bool init(const char * name, uint32_t flags = 0); 366 367 /** 368 * Initializes a RenderScript context. A context must be initialized before it can be used. 369 * @param[in] name Directory name to be used by this context. This should be equivalent to 370 * Context.getCacheDir(). 371 * @param[in] flags Flags for this context. 372 * @param[in] targetApi Target RS API level. 373 * @return true on success 374 */ 375 bool init(const char * name, uint32_t flags, int targetApi); 376 377 /** 378 * Sets the error handler function for this context. This error handler is 379 * called whenever an error is set. 380 * 381 * @param[in] func Error handler function 382 */ 383 void setErrorHandler(ErrorHandlerFunc_t func); 384 385 /** 386 * Returns the current error handler function for this context. 387 * 388 * @return pointer to current error handler function or NULL if not set 389 */ 390 ErrorHandlerFunc_t getErrorHandler() { return mErrorFunc; } 391 392 /** 393 * Sets the message handler function for this context. This message handler 394 * is called whenever a message is sent from a RenderScript kernel. 395 * 396 * @param[in] func Message handler function 397 */ 398 void setMessageHandler(MessageHandlerFunc_t func); 399 400 /** 401 * Returns the current message handler function for this context. 402 * 403 * @return pointer to current message handler function or NULL if not set 404 */ 405 MessageHandlerFunc_t getMessageHandler() { return mMessageFunc; } 406 407 /** 408 * Returns current status for the context. 409 * 410 * @return current error 411 */ 412 RSError getError(); 413 414 /** 415 * Waits for any currently running asynchronous operations to finish. This 416 * should only be used for performance testing and timing. 417 */ 418 void finish(); 419 420 RsContext getContext() { return mContext; } 421 void throwError(RSError error, const char *errMsg); 422 423 static dispatchTable* dispatch; 424 425 private: 426 static bool usingNative; 427 static bool initDispatch(int targetApi); 428 429 static void * threadProc(void *); 430 431 static bool gInitialized; 432 static pthread_mutex_t gInitMutex; 433 434 pthread_t mMessageThreadId; 435 pid_t mNativeMessageThreadId; 436 bool mMessageRun; 437 438 RsContext mContext; 439 RSError mCurrentError; 440 441 ErrorHandlerFunc_t mErrorFunc; 442 MessageHandlerFunc_t mMessageFunc; 443 bool mInit; 444 445 char mCacheDir[PATH_MAX+1]; 446 uint32_t mCacheDirLen; 447 448 struct { 449 sp<const Element> U8; 450 sp<const Element> U8_2; 451 sp<const Element> U8_3; 452 sp<const Element> U8_4; 453 sp<const Element> I8; 454 sp<const Element> I8_2; 455 sp<const Element> I8_3; 456 sp<const Element> I8_4; 457 sp<const Element> U16; 458 sp<const Element> U16_2; 459 sp<const Element> U16_3; 460 sp<const Element> U16_4; 461 sp<const Element> I16; 462 sp<const Element> I16_2; 463 sp<const Element> I16_3; 464 sp<const Element> I16_4; 465 sp<const Element> U32; 466 sp<const Element> U32_2; 467 sp<const Element> U32_3; 468 sp<const Element> U32_4; 469 sp<const Element> I32; 470 sp<const Element> I32_2; 471 sp<const Element> I32_3; 472 sp<const Element> I32_4; 473 sp<const Element> U64; 474 sp<const Element> U64_2; 475 sp<const Element> U64_3; 476 sp<const Element> U64_4; 477 sp<const Element> I64; 478 sp<const Element> I64_2; 479 sp<const Element> I64_3; 480 sp<const Element> I64_4; 481 sp<const Element> F16; 482 sp<const Element> F16_2; 483 sp<const Element> F16_3; 484 sp<const Element> F16_4; 485 sp<const Element> F32; 486 sp<const Element> F32_2; 487 sp<const Element> F32_3; 488 sp<const Element> F32_4; 489 sp<const Element> F64; 490 sp<const Element> F64_2; 491 sp<const Element> F64_3; 492 sp<const Element> F64_4; 493 sp<const Element> BOOLEAN; 494 495 sp<const Element> ELEMENT; 496 sp<const Element> TYPE; 497 sp<const Element> ALLOCATION; 498 sp<const Element> SAMPLER; 499 sp<const Element> SCRIPT; 500 sp<const Element> MESH; 501 sp<const Element> PROGRAM_FRAGMENT; 502 sp<const Element> PROGRAM_VERTEX; 503 sp<const Element> PROGRAM_RASTER; 504 sp<const Element> PROGRAM_STORE; 505 506 sp<const Element> A_8; 507 sp<const Element> RGB_565; 508 sp<const Element> RGB_888; 509 sp<const Element> RGBA_5551; 510 sp<const Element> RGBA_4444; 511 sp<const Element> RGBA_8888; 512 513 sp<const Element> YUV; 514 515 sp<const Element> MATRIX_4X4; 516 sp<const Element> MATRIX_3X3; 517 sp<const Element> MATRIX_2X2; 518 } mElements; 519 520 struct { 521 sp<const Sampler> CLAMP_NEAREST; 522 sp<const Sampler> CLAMP_LINEAR; 523 sp<const Sampler> CLAMP_LINEAR_MIP_LINEAR; 524 sp<const Sampler> WRAP_NEAREST; 525 sp<const Sampler> WRAP_LINEAR; 526 sp<const Sampler> WRAP_LINEAR_MIP_LINEAR; 527 sp<const Sampler> MIRRORED_REPEAT_NEAREST; 528 sp<const Sampler> MIRRORED_REPEAT_LINEAR; 529 sp<const Sampler> MIRRORED_REPEAT_LINEAR_MIP_LINEAR; 530 } mSamplers; 531 friend class Sampler; 532 friend class Element; 533 friend class ScriptC; 534 }; 535 536 /** 537 * Base class for all RenderScript objects. Not for direct use by developers. 538 */ 539 class BaseObj : public android::RSC::LightRefBase<BaseObj> { 540 public: 541 void * getID() const; 542 virtual ~BaseObj(); 543 virtual void updateFromNative(); 544 virtual bool equals(const sp<const BaseObj>& obj); 545 546 protected: 547 void *mID; 548 RS* mRS; 549 const char * mName; 550 551 BaseObj(void *id, sp<RS> rs); 552 void checkValid(); 553 554 static void * getObjID(const sp<const BaseObj>& o); 555 556 }; 557 558 /** 559 * This class provides the primary method through which data is passed to and 560 * from RenderScript kernels. An Allocation provides the backing store for a 561 * given Type. 562 * 563 * An Allocation also contains a set of usage flags that denote how the 564 * Allocation could be used. For example, an Allocation may have usage flags 565 * specifying that it can be used from a script as well as input to a 566 * Sampler. A developer must synchronize across these different usages using 567 * syncAll(int) in order to ensure that different users of the Allocation have 568 * a consistent view of memory. For example, in the case where an Allocation is 569 * used as the output of one kernel and as Sampler input in a later kernel, a 570 * developer must call syncAll(RS_ALLOCATION_USAGE_SCRIPT) prior to launching the 571 * second kernel to ensure correctness. 572 */ 573 class Allocation : public BaseObj { 574 protected: 575 sp<const Type> mType; 576 uint32_t mUsage; 577 sp<Allocation> mAdaptedAllocation; 578 579 bool mConstrainedLOD; 580 bool mConstrainedFace; 581 bool mConstrainedY; 582 bool mConstrainedZ; 583 bool mReadAllowed; 584 bool mWriteAllowed; 585 bool mAutoPadding; 586 uint32_t mSelectedY; 587 uint32_t mSelectedZ; 588 uint32_t mSelectedLOD; 589 RsAllocationCubemapFace mSelectedFace; 590 591 uint32_t mCurrentDimX; 592 uint32_t mCurrentDimY; 593 uint32_t mCurrentDimZ; 594 uint32_t mCurrentCount; 595 596 void * getIDSafe() const; 597 void updateCacheInfo(const sp<const Type>& t); 598 599 Allocation(void *id, sp<RS> rs, sp<const Type> t, uint32_t usage); 600 601 void validateIsInt64(); 602 void validateIsInt32(); 603 void validateIsInt16(); 604 void validateIsInt8(); 605 void validateIsFloat32(); 606 void validateIsFloat64(); 607 void validateIsObject(); 608 609 virtual void updateFromNative(); 610 611 void validate2DRange(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h); 612 void validate3DRange(uint32_t xoff, uint32_t yoff, uint32_t zoff, 613 uint32_t w, uint32_t h, uint32_t d); 614 615 public: 616 617 /** 618 * Return Type for the allocation. 619 * @return pointer to underlying Type 620 */ 621 sp<const Type> getType() const { 622 return mType; 623 } 624 625 /** 626 * Enable/Disable AutoPadding for Vec3 elements. 627 * 628 * @param useAutoPadding True: enable AutoPadding; flase: disable AutoPadding 629 * 630 */ 631 void setAutoPadding(bool useAutoPadding) { 632 mAutoPadding = useAutoPadding; 633 } 634 635 /** 636 * Propagate changes from one usage of the Allocation to other usages of the Allocation. 637 * @param[in] srcLocation source location with changes to propagate elsewhere 638 */ 639 void syncAll(RsAllocationUsageType srcLocation); 640 641 /** 642 * Send a buffer to the output stream. The contents of the Allocation will 643 * be undefined after this operation. This operation is only valid if 644 * USAGE_IO_OUTPUT is set on the Allocation. 645 */ 646 void ioSendOutput(); 647 648 /** 649 * Receive the latest input into the Allocation. This operation 650 * is only valid if USAGE_IO_INPUT is set on the Allocation. 651 */ 652 void ioGetInput(); 653 654 #ifndef RS_COMPATIBILITY_LIB 655 /** 656 * Returns the handle to a raw buffer that is being managed by the screen 657 * compositor. This operation is only valid for Allocations with USAGE_IO_INPUT. 658 * @return Surface associated with allocation 659 */ 660 sp<Surface> getSurface(); 661 662 /** 663 * Associate a Surface with this Allocation. This 664 * operation is only valid for Allocations with USAGE_IO_OUTPUT. 665 * @param[in] s Surface to associate with allocation 666 */ 667 void setSurface(const sp<Surface>& s); 668 #endif 669 670 /** 671 * Generate a mipmap chain. This is only valid if the Type of the Allocation 672 * includes mipmaps. This function will generate a complete set of mipmaps 673 * from the top level LOD and place them into the script memory space. If 674 * the Allocation is also using other memory spaces, a call to 675 * syncAll(Allocation.USAGE_SCRIPT) is required. 676 */ 677 void generateMipmaps(); 678 679 /** 680 * Copy an array into part of this Allocation. 681 * @param[in] off offset of first Element to be overwritten 682 * @param[in] count number of Elements to copy 683 * @param[in] data array from which to copy 684 */ 685 void copy1DRangeFrom(uint32_t off, size_t count, const void *data); 686 687 /** 688 * Copy part of an Allocation into part of this Allocation. 689 * @param[in] off offset of first Element to be overwritten 690 * @param[in] count number of Elements to copy 691 * @param[in] data Allocation from which to copy 692 * @param[in] dataOff offset of first Element in data to copy 693 */ 694 void copy1DRangeFrom(uint32_t off, size_t count, const sp<const Allocation>& data, uint32_t dataOff); 695 696 /** 697 * Copy an array into part of this Allocation. 698 * @param[in] off offset of first Element to be overwritten 699 * @param[in] count number of Elements to copy 700 * @param[in] data array from which to copy 701 */ 702 void copy1DRangeTo(uint32_t off, size_t count, void *data); 703 704 /** 705 * Copy entire array to an Allocation. 706 * @param[in] data array from which to copy 707 */ 708 void copy1DFrom(const void* data); 709 710 /** 711 * Copy entire Allocation to an array. 712 * @param[in] data destination array 713 */ 714 void copy1DTo(void* data); 715 716 /** 717 * Copy from an array into a rectangular region in this Allocation. The 718 * array is assumed to be tightly packed. 719 * @param[in] xoff X offset of region to update in this Allocation 720 * @param[in] yoff Y offset of region to update in this Allocation 721 * @param[in] w Width of region to update 722 * @param[in] h Height of region to update 723 * @param[in] data Array from which to copy 724 */ 725 void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, 726 const void *data); 727 728 /** 729 * Copy from this Allocation into a rectangular region in an array. The 730 * array is assumed to be tightly packed. 731 * @param[in] xoff X offset of region to copy from this Allocation 732 * @param[in] yoff Y offset of region to copy from this Allocation 733 * @param[in] w Width of region to update 734 * @param[in] h Height of region to update 735 * @param[in] data destination array 736 */ 737 void copy2DRangeTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, 738 void *data); 739 740 /** 741 * Copy from an Allocation into a rectangular region in this Allocation. 742 * @param[in] xoff X offset of region to update in this Allocation 743 * @param[in] yoff Y offset of region to update in this Allocation 744 * @param[in] w Width of region to update 745 * @param[in] h Height of region to update 746 * @param[in] data Allocation from which to copy 747 * @param[in] dataXoff X offset of region to copy from in data 748 * @param[in] dataYoff Y offset of region to copy from in data 749 */ 750 void copy2DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, 751 const sp<const Allocation>& data, uint32_t dataXoff, uint32_t dataYoff); 752 753 /** 754 * Copy from a strided array into a rectangular region in this Allocation. 755 * @param[in] xoff X offset of region to update in this Allocation 756 * @param[in] yoff Y offset of region to update in this Allocation 757 * @param[in] w Width of region to update 758 * @param[in] h Height of region to update 759 * @param[in] data array from which to copy 760 * @param[in] stride stride of data in bytes 761 */ 762 void copy2DStridedFrom(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, 763 const void *data, size_t stride); 764 765 /** 766 * Copy from a strided array into this Allocation. 767 * @param[in] data array from which to copy 768 * @param[in] stride stride of data in bytes 769 */ 770 void copy2DStridedFrom(const void *data, size_t stride); 771 772 /** 773 * Copy from a rectangular region in this Allocation into a strided array. 774 * @param[in] xoff X offset of region to update in this Allocation 775 * @param[in] yoff Y offset of region to update in this Allocation 776 * @param[in] w Width of region to update 777 * @param[in] h Height of region to update 778 * @param[in] data destination array 779 * @param[in] stride stride of data in bytes 780 */ 781 void copy2DStridedTo(uint32_t xoff, uint32_t yoff, uint32_t w, uint32_t h, 782 void *data, size_t stride); 783 784 /** 785 * Copy this Allocation into a strided array. 786 * @param[in] data destination array 787 * @param[in] stride stride of data in bytes 788 */ 789 void copy2DStridedTo(void *data, size_t stride); 790 791 792 /** 793 * Copy from an array into a 3D region in this Allocation. The 794 * array is assumed to be tightly packed. 795 * @param[in] xoff X offset of region to update in this Allocation 796 * @param[in] yoff Y offset of region to update in this Allocation 797 * @param[in] zoff Z offset of region to update in this Allocation 798 * @param[in] w Width of region to update 799 * @param[in] h Height of region to update 800 * @param[in] d Depth of region to update 801 * @param[in] data Array from which to copy 802 */ 803 void copy3DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t w, 804 uint32_t h, uint32_t d, const void* data); 805 806 /** 807 * Copy from an Allocation into a 3D region in this Allocation. 808 * @param[in] xoff X offset of region to update in this Allocation 809 * @param[in] yoff Y offset of region to update in this Allocation 810 * @param[in] zoff Z offset of region to update in this Allocation 811 * @param[in] w Width of region to update 812 * @param[in] h Height of region to update 813 * @param[in] d Depth of region to update 814 * @param[in] data Allocation from which to copy 815 * @param[in] dataXoff X offset of region in data to copy from 816 * @param[in] dataYoff Y offset of region in data to copy from 817 * @param[in] dataZoff Z offset of region in data to copy from 818 */ 819 void copy3DRangeFrom(uint32_t xoff, uint32_t yoff, uint32_t zoff, 820 uint32_t w, uint32_t h, uint32_t d, 821 const sp<const Allocation>& data, 822 uint32_t dataXoff, uint32_t dataYoff, uint32_t dataZoff); 823 824 /** 825 * Copy a 3D region in this Allocation into an array. The 826 * array is assumed to be tightly packed. 827 * @param[in] xoff X offset of region to update in this Allocation 828 * @param[in] yoff Y offset of region to update in this Allocation 829 * @param[in] zoff Z offset of region to update in this Allocation 830 * @param[in] w Width of region to update 831 * @param[in] h Height of region to update 832 * @param[in] d Depth of region to update 833 * @param[in] data Array from which to copy 834 */ 835 void copy3DRangeTo(uint32_t xoff, uint32_t yoff, uint32_t zoff, uint32_t w, 836 uint32_t h, uint32_t d, void* data); 837 838 /** 839 * Creates an Allocation for use by scripts with a given Type. 840 * @param[in] rs Context to which the Allocation will belong 841 * @param[in] type Type of the Allocation 842 * @param[in] mipmaps desired mipmap behavior for the Allocation 843 * @param[in] usage usage for the Allocation 844 * @return new Allocation 845 */ 846 static sp<Allocation> createTyped(const sp<RS>& rs, const sp<const Type>& type, 847 RsAllocationMipmapControl mipmaps, uint32_t usage); 848 849 /** 850 * Creates an Allocation for use by scripts with a given Type and a backing pointer. For use 851 * with RS_ALLOCATION_USAGE_SHARED. 852 * @param[in] rs Context to which the Allocation will belong 853 * @param[in] type Type of the Allocation 854 * @param[in] mipmaps desired mipmap behavior for the Allocation 855 * @param[in] usage usage for the Allocation 856 * @param[in] pointer existing backing store to use for this Allocation if possible 857 * @return new Allocation 858 */ 859 static sp<Allocation> createTyped(const sp<RS>& rs, const sp<const Type>& type, 860 RsAllocationMipmapControl mipmaps, uint32_t usage, void * pointer); 861 862 /** 863 * Creates an Allocation for use by scripts with a given Type with no mipmaps. 864 * @param[in] rs Context to which the Allocation will belong 865 * @param[in] type Type of the Allocation 866 * @param[in] usage usage for the Allocation 867 * @return new Allocation 868 */ 869 static sp<Allocation> createTyped(const sp<RS>& rs, const sp<const Type>& type, 870 uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT); 871 /** 872 * Creates an Allocation with a specified number of given elements. 873 * @param[in] rs Context to which the Allocation will belong 874 * @param[in] e Element used in the Allocation 875 * @param[in] count Number of elements of the Allocation 876 * @param[in] usage usage for the Allocation 877 * @return new Allocation 878 */ 879 static sp<Allocation> createSized(const sp<RS>& rs, const sp<const Element>& e, size_t count, 880 uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT); 881 882 /** 883 * Creates a 2D Allocation with a specified number of given elements. 884 * @param[in] rs Context to which the Allocation will belong 885 * @param[in] e Element used in the Allocation 886 * @param[in] x Width in Elements of the Allocation 887 * @param[in] y Height of the Allocation 888 * @param[in] usage usage for the Allocation 889 * @return new Allocation 890 */ 891 static sp<Allocation> createSized2D(const sp<RS>& rs, const sp<const Element>& e, 892 size_t x, size_t y, 893 uint32_t usage = RS_ALLOCATION_USAGE_SCRIPT); 894 895 896 /** 897 * Get the backing pointer for a USAGE_SHARED allocation. 898 * @param[in] stride optional parameter. when non-NULL, will contain 899 * stride in bytes of a 2D Allocation 900 * @return pointer to data 901 */ 902 void * getPointer(size_t *stride = NULL); 903 }; 904 905 /** 906 * An Element represents one item within an Allocation. An Element is roughly 907 * equivalent to a C type in a RenderScript kernel. Elements may be basic 908 * or complex. Some basic elements are: 909 910 * - A single float value (equivalent to a float in a kernel) 911 * - A four-element float vector (equivalent to a float4 in a kernel) 912 * - An unsigned 32-bit integer (equivalent to an unsigned int in a kernel) 913 * - A single signed 8-bit integer (equivalent to a char in a kernel) 914 915 * Basic Elements are comprised of a Element.DataType and a 916 * Element.DataKind. The DataType encodes C type information of an Element, 917 * while the DataKind encodes how that Element should be interpreted by a 918 * Sampler. Note that Allocation objects with DataKind USER cannot be used as 919 * input for a Sampler. In general, Allocation objects that are intended for 920 * use with a Sampler should use bitmap-derived Elements such as 921 * Element::RGBA_8888. 922 */ 923 924 925 class Element : public BaseObj { 926 public: 927 bool isComplex(); 928 929 /** 930 * Elements could be simple, such as an int or a float, or a structure with 931 * multiple sub-elements, such as a collection of floats, float2, 932 * float4. This function returns zero for simple elements or the number of 933 * sub-elements otherwise. 934 * @return number of sub-elements 935 */ 936 size_t getSubElementCount() { 937 return mVisibleElementMapSize; 938 } 939 940 /** 941 * For complex Elements, this returns the sub-element at a given index. 942 * @param[in] index index of sub-element 943 * @return sub-element 944 */ 945 sp<const Element> getSubElement(uint32_t index); 946 947 /** 948 * For complex Elements, this returns the name of the sub-element at a given 949 * index. 950 * @param[in] index index of sub-element 951 * @return name of sub-element 952 */ 953 const char * getSubElementName(uint32_t index); 954 955 /** 956 * For complex Elements, this returns the size of the sub-element at a given 957 * index. 958 * @param[in] index index of sub-element 959 * @return size of sub-element 960 */ 961 size_t getSubElementArraySize(uint32_t index); 962 963 /** 964 * Returns the location of a sub-element within a complex Element. 965 * @param[in] index index of sub-element 966 * @return offset in bytes 967 */ 968 uint32_t getSubElementOffsetBytes(uint32_t index); 969 970 /** 971 * Returns the data type used for the Element. 972 * @return data type 973 */ 974 RsDataType getDataType() const { 975 return mType; 976 } 977 978 /** 979 * Returns the data kind used for the Element. 980 * @return data kind 981 */ 982 RsDataKind getDataKind() const { 983 return mKind; 984 } 985 986 /** 987 * Returns the size in bytes of the Element. 988 * @return size in bytes 989 */ 990 size_t getSizeBytes() const { 991 return mSizeBytes; 992 } 993 994 /** 995 * Returns the number of vector components for this Element. 996 * @return number of vector components 997 */ 998 uint32_t getVectorSize() const { 999 return mVectorSize; 1000 } 1001 1002 /** 1003 * Utility function for returning an Element containing a single bool. 1004 * @param[in] rs RenderScript context 1005 * @return Element 1006 */ 1007 static sp<const Element> BOOLEAN(const sp<RS> &rs); 1008 /** 1009 * Utility function for returning an Element containing a single unsigned char. 1010 * @param[in] rs RenderScript context 1011 * @return Element 1012 */ 1013 static sp<const Element> U8(const sp<RS> &rs); 1014 /** 1015 * Utility function for returning an Element containing a single signed char. 1016 * @param[in] rs RenderScript context 1017 * @return Element 1018 */ 1019 static sp<const Element> I8(const sp<RS> &rs); 1020 /** 1021 * Utility function for returning an Element containing a single unsigned short. 1022 * @param[in] rs RenderScript context 1023 * @return Element 1024 */ 1025 static sp<const Element> U16(const sp<RS> &rs); 1026 /** 1027 * Utility function for returning an Element containing a single signed short. 1028 * @param[in] rs RenderScript context 1029 * @return Element 1030 */ 1031 static sp<const Element> I16(const sp<RS> &rs); 1032 /** 1033 * Utility function for returning an Element containing a single unsigned int. 1034 * @param[in] rs RenderScript context 1035 * @return Element 1036 */ 1037 static sp<const Element> U32(const sp<RS> &rs); 1038 /** 1039 * Utility function for returning an Element containing a single signed int. 1040 * @param[in] rs RenderScript context 1041 * @return Element 1042 */ 1043 static sp<const Element> I32(const sp<RS> &rs); 1044 /** 1045 * Utility function for returning an Element containing a single unsigned long long. 1046 * @param[in] rs RenderScript context 1047 * @return Element 1048 */ 1049 static sp<const Element> U64(const sp<RS> &rs); 1050 /** 1051 * Utility function for returning an Element containing a single signed long long. 1052 * @param[in] rs RenderScript context 1053 * @return Element 1054 */ 1055 static sp<const Element> I64(const sp<RS> &rs); 1056 /** 1057 * Utility function for returning an Element containing a single half. 1058 * @param[in] rs RenderScript context 1059 * @return Element 1060 */ 1061 static sp<const Element> F16(const sp<RS> &rs); 1062 /** 1063 * Utility function for returning an Element containing a single float. 1064 * @param[in] rs RenderScript context 1065 * @return Element 1066 */ 1067 static sp<const Element> F32(const sp<RS> &rs); 1068 /** 1069 * Utility function for returning an Element containing a single double. 1070 * @param[in] rs RenderScript context 1071 * @return Element 1072 */ 1073 static sp<const Element> F64(const sp<RS> &rs); 1074 /** 1075 * Utility function for returning an Element containing a single Element. 1076 * @param[in] rs RenderScript context 1077 * @return Element 1078 */ 1079 static sp<const Element> ELEMENT(const sp<RS> &rs); 1080 /** 1081 * Utility function for returning an Element containing a single Type. 1082 * @param[in] rs RenderScript context 1083 * @return Element 1084 */ 1085 static sp<const Element> TYPE(const sp<RS> &rs); 1086 /** 1087 * Utility function for returning an Element containing a single Allocation. 1088 * @param[in] rs RenderScript context 1089 * @return Element 1090 */ 1091 static sp<const Element> ALLOCATION(const sp<RS> &rs); 1092 /** 1093 * Utility function for returning an Element containing a single Sampler. 1094 * @param[in] rs RenderScript context 1095 * @return Element 1096 */ 1097 static sp<const Element> SAMPLER(const sp<RS> &rs); 1098 /** 1099 * Utility function for returning an Element containing a single Script. 1100 * @param[in] rs RenderScript context 1101 * @return Element 1102 */ 1103 static sp<const Element> SCRIPT(const sp<RS> &rs); 1104 /** 1105 * Utility function for returning an Element containing an ALPHA_8 pixel. 1106 * @param[in] rs RenderScript context 1107 * @return Element 1108 */ 1109 static sp<const Element> A_8(const sp<RS> &rs); 1110 /** 1111 * Utility function for returning an Element containing an RGB_565 pixel. 1112 * @param[in] rs RenderScript context 1113 * @return Element 1114 */ 1115 static sp<const Element> RGB_565(const sp<RS> &rs); 1116 /** 1117 * Utility function for returning an Element containing an RGB_888 pixel. 1118 * @param[in] rs RenderScript context 1119 * @return Element 1120 */ 1121 static sp<const Element> RGB_888(const sp<RS> &rs); 1122 /** 1123 * Utility function for returning an Element containing an RGBA_5551 pixel. 1124 * @param[in] rs RenderScript context 1125 * @return Element 1126 */ 1127 static sp<const Element> RGBA_5551(const sp<RS> &rs); 1128 /** 1129 * Utility function for returning an Element containing an RGBA_4444 pixel. 1130 * @param[in] rs RenderScript context 1131 * @return Element 1132 */ 1133 static sp<const Element> RGBA_4444(const sp<RS> &rs); 1134 /** 1135 * Utility function for returning an Element containing an RGBA_8888 pixel. 1136 * @param[in] rs RenderScript context 1137 * @return Element 1138 */ 1139 static sp<const Element> RGBA_8888(const sp<RS> &rs); 1140 1141 /** 1142 * Utility function for returning an Element containing a half2. 1143 * @param[in] rs RenderScript context 1144 * @return Element 1145 */ 1146 static sp<const Element> F16_2(const sp<RS> &rs); 1147 /** 1148 * Utility function for returning an Element containing a half3. 1149 * @param[in] rs RenderScript context 1150 * @return Element 1151 */ 1152 static sp<const Element> F16_3(const sp<RS> &rs); 1153 /** 1154 * Utility function for returning an Element containing a half4. 1155 * @param[in] rs RenderScript context 1156 * @return Element 1157 */ 1158 static sp<const Element> F16_4(const sp<RS> &rs); 1159 1160 /** 1161 * Utility function for returning an Element containing a float2. 1162 * @param[in] rs RenderScript context 1163 * @return Element 1164 */ 1165 static sp<const Element> F32_2(const sp<RS> &rs); 1166 /** 1167 * Utility function for returning an Element containing a float3. 1168 * @param[in] rs RenderScript context 1169 * @return Element 1170 */ 1171 static sp<const Element> F32_3(const sp<RS> &rs); 1172 /** 1173 * Utility function for returning an Element containing a float4. 1174 * @param[in] rs RenderScript context 1175 * @return Element 1176 */ 1177 static sp<const Element> F32_4(const sp<RS> &rs); 1178 /** 1179 * Utility function for returning an Element containing a double2. 1180 * @param[in] rs RenderScript context 1181 * @return Element 1182 */ 1183 static sp<const Element> F64_2(const sp<RS> &rs); 1184 /** 1185 * Utility function for returning an Element containing a double3. 1186 * @param[in] rs RenderScript context 1187 * @return Element 1188 */ 1189 static sp<const Element> F64_3(const sp<RS> &rs); 1190 /** 1191 * Utility function for returning an Element containing a double4. 1192 * @param[in] rs RenderScript context 1193 * @return Element 1194 */ 1195 static sp<const Element> F64_4(const sp<RS> &rs); 1196 /** 1197 * Utility function for returning an Element containing a uchar2. 1198 * @param[in] rs RenderScript context 1199 * @return Element 1200 */ 1201 static sp<const Element> U8_2(const sp<RS> &rs); 1202 /** 1203 * Utility function for returning an Element containing a uchar3. 1204 * @param[in] rs RenderScript context 1205 * @return Element 1206 */ 1207 static sp<const Element> U8_3(const sp<RS> &rs); 1208 /** 1209 * Utility function for returning an Element containing a uchar4. 1210 * @param[in] rs RenderScript context 1211 * @return Element 1212 */ 1213 static sp<const Element> U8_4(const sp<RS> &rs); 1214 /** 1215 * Utility function for returning an Element containing a char2. 1216 * @param[in] rs RenderScript context 1217 * @return Element 1218 */ 1219 static sp<const Element> I8_2(const sp<RS> &rs); 1220 /** 1221 * Utility function for returning an Element containing a char3. 1222 * @param[in] rs RenderScript context 1223 * @return Element 1224 */ 1225 static sp<const Element> I8_3(const sp<RS> &rs); 1226 /** 1227 * Utility function for returning an Element containing a char4. 1228 * @param[in] rs RenderScript context 1229 * @return Element 1230 */ 1231 static sp<const Element> I8_4(const sp<RS> &rs); 1232 /** 1233 * Utility function for returning an Element containing a ushort2. 1234 * @param[in] rs RenderScript context 1235 * @return Element 1236 */ 1237 static sp<const Element> U16_2(const sp<RS> &rs); 1238 /** 1239 * Utility function for returning an Element containing a ushort3. 1240 * @param[in] rs RenderScript context 1241 * @return Element 1242 */ 1243 static sp<const Element> U16_3(const sp<RS> &rs); 1244 /** 1245 * Utility function for returning an Element containing a ushort4. 1246 * @param[in] rs RenderScript context 1247 * @return Element 1248 */ 1249 static sp<const Element> U16_4(const sp<RS> &rs); 1250 /** 1251 * Utility function for returning an Element containing a short2. 1252 * @param[in] rs RenderScript context 1253 * @return Element 1254 */ 1255 static sp<const Element> I16_2(const sp<RS> &rs); 1256 /** 1257 * Utility function for returning an Element containing a short3. 1258 * @param[in] rs RenderScript context 1259 * @return Element 1260 */ 1261 static sp<const Element> I16_3(const sp<RS> &rs); 1262 /** 1263 * Utility function for returning an Element containing a short4. 1264 * @param[in] rs RenderScript context 1265 * @return Element 1266 */ 1267 static sp<const Element> I16_4(const sp<RS> &rs); 1268 /** 1269 * Utility function for returning an Element containing a uint2. 1270 * @param[in] rs RenderScript context 1271 * @return Element 1272 */ 1273 static sp<const Element> U32_2(const sp<RS> &rs); 1274 /** 1275 * Utility function for returning an Element containing a uint3. 1276 * @param[in] rs RenderScript context 1277 * @return Element 1278 */ 1279 static sp<const Element> U32_3(const sp<RS> &rs); 1280 /** 1281 * Utility function for returning an Element containing a uint4. 1282 * @param[in] rs RenderScript context 1283 * @return Element 1284 */ 1285 static sp<const Element> U32_4(const sp<RS> &rs); 1286 /** 1287 * Utility function for returning an Element containing an int2. 1288 * @param[in] rs RenderScript context 1289 * @return Element 1290 */ 1291 static sp<const Element> I32_2(const sp<RS> &rs); 1292 /** 1293 * Utility function for returning an Element containing an int3. 1294 * @param[in] rs RenderScript context 1295 * @return Element 1296 */ 1297 static sp<const Element> I32_3(const sp<RS> &rs); 1298 /** 1299 * Utility function for returning an Element containing an int4. 1300 * @param[in] rs RenderScript context 1301 * @return Element 1302 */ 1303 static sp<const Element> I32_4(const sp<RS> &rs); 1304 /** 1305 * Utility function for returning an Element containing a ulong2. 1306 * @param[in] rs RenderScript context 1307 * @return Element 1308 */ 1309 static sp<const Element> U64_2(const sp<RS> &rs); 1310 /** 1311 * Utility function for returning an Element containing a ulong3. 1312 * @param[in] rs RenderScript context 1313 * @return Element 1314 */ 1315 static sp<const Element> U64_3(const sp<RS> &rs); 1316 /** 1317 * Utility function for returning an Element containing a ulong4. 1318 * @param[in] rs RenderScript context 1319 * @return Element 1320 */ 1321 static sp<const Element> U64_4(const sp<RS> &rs); 1322 /** 1323 * Utility function for returning an Element containing a long2. 1324 * @param[in] rs RenderScript context 1325 * @return Element 1326 */ 1327 static sp<const Element> I64_2(const sp<RS> &rs); 1328 /** 1329 * Utility function for returning an Element containing a long3. 1330 * @param[in] rs RenderScript context 1331 * @return Element 1332 */ 1333 static sp<const Element> I64_3(const sp<RS> &rs); 1334 /** 1335 * Utility function for returning an Element containing a long4. 1336 * @param[in] rs RenderScript context 1337 * @return Element 1338 */ 1339 static sp<const Element> I64_4(const sp<RS> &rs); 1340 /** 1341 * Utility function for returning an Element containing a YUV pixel. 1342 * @param[in] rs RenderScript context 1343 * @return Element 1344 */ 1345 static sp<const Element> YUV(const sp<RS> &rs); 1346 /** 1347 * Utility function for returning an Element containing an rs_matrix_4x4. 1348 * @param[in] rs RenderScript context 1349 * @return Element 1350 */ 1351 static sp<const Element> MATRIX_4X4(const sp<RS> &rs); 1352 /** 1353 * Utility function for returning an Element containing an rs_matrix_3x3. 1354 * @param[in] rs RenderScript context 1355 * @return Element 1356 */ 1357 static sp<const Element> MATRIX_3X3(const sp<RS> &rs); 1358 /** 1359 * Utility function for returning an Element containing an rs_matrix_2x2. 1360 * @param[in] rs RenderScript context 1361 * @return Element 1362 */ 1363 static sp<const Element> MATRIX_2X2(const sp<RS> &rs); 1364 1365 void updateFromNative(); 1366 1367 /** 1368 * Create an Element with a given DataType. 1369 * @param[in] rs RenderScript context 1370 * @param[in] dt data type 1371 * @return Element 1372 */ 1373 static sp<const Element> createUser(const sp<RS>& rs, RsDataType dt); 1374 /** 1375 * Create a vector Element with the given DataType 1376 * @param[in] rs RenderScript 1377 * @param[in] dt DataType 1378 * @param[in] size vector size 1379 * @return Element 1380 */ 1381 static sp<const Element> createVector(const sp<RS>& rs, RsDataType dt, uint32_t size); 1382 /** 1383 * Create an Element with a given DataType and DataKind. 1384 * @param[in] rs RenderScript context 1385 * @param[in] dt DataType 1386 * @param[in] dk DataKind 1387 * @return Element 1388 */ 1389 static sp<const Element> createPixel(const sp<RS>& rs, RsDataType dt, RsDataKind dk); 1390 1391 /** 1392 * Returns true if the Element can interoperate with this Element. 1393 * @param[in] e Element to compare 1394 * @return true if Elements can interoperate 1395 */ 1396 bool isCompatible(const sp<const Element>&e) const; 1397 1398 /** 1399 * Builder class for producing complex elements with matching field and name 1400 * pairs. The builder starts empty. The order in which elements are added is 1401 * retained for the layout in memory. 1402 */ 1403 class Builder { 1404 private: 1405 RS* mRS; 1406 size_t mElementsCount; 1407 size_t mElementsVecSize; 1408 sp<const Element> * mElements; 1409 char ** mElementNames; 1410 size_t * mElementNameLengths; 1411 uint32_t * mArraySizes; 1412 bool mSkipPadding; 1413 1414 public: 1415 explicit Builder(sp<RS> rs); 1416 ~Builder(); 1417 void add(const sp<const Element>& e, const char * name, uint32_t arraySize = 1); 1418 sp<const Element> create(); 1419 }; 1420 1421 protected: 1422 friend class Type; 1423 Element(void *id, sp<RS> rs, 1424 sp<const Element> * elements, 1425 size_t elementCount, 1426 const char ** elementNames, 1427 size_t * elementNameLengths, 1428 uint32_t * arraySizes); 1429 Element(void *id, sp<RS> rs, RsDataType dt, RsDataKind dk, bool norm, uint32_t size); 1430 Element(void *id, sp<RS> rs); 1431 explicit Element(sp<RS> rs); 1432 virtual ~Element(); 1433 1434 private: 1435 void updateVisibleSubElements(); 1436 1437 size_t mElementsCount; 1438 size_t mVisibleElementMapSize; 1439 1440 sp<const Element> * mElements; 1441 char ** mElementNames; 1442 size_t * mElementNameLengths; 1443 uint32_t * mArraySizes; 1444 uint32_t * mVisibleElementMap; 1445 uint32_t * mOffsetInBytes; 1446 1447 RsDataType mType; 1448 RsDataKind mKind; 1449 bool mNormalized; 1450 size_t mSizeBytes; 1451 size_t mVectorSize; 1452 }; 1453 1454 class FieldPacker { 1455 protected: 1456 unsigned char* mData; 1457 size_t mPos; 1458 size_t mLen; 1459 1460 public: 1461 explicit FieldPacker(size_t len) 1462 : mPos(0), mLen(len) { 1463 mData = new unsigned char[len]; 1464 } 1465 1466 virtual ~FieldPacker() { 1467 delete [] mData; 1468 } 1469 1470 void align(size_t v) { 1471 if ((v & (v - 1)) != 0) { 1472 // ALOGE("Non-power-of-two alignment: %zu", v); 1473 return; 1474 } 1475 1476 while ((mPos & (v - 1)) != 0) { 1477 mData[mPos++] = 0; 1478 } 1479 } 1480 1481 void reset() { 1482 mPos = 0; 1483 } 1484 1485 void reset(size_t i) { 1486 if (i >= mLen) { 1487 // ALOGE("Out of bounds: i (%zu) >= len (%zu)", i, mLen); 1488 return; 1489 } 1490 mPos = i; 1491 } 1492 1493 void skip(size_t i) { 1494 size_t res = mPos + i; 1495 if (res > mLen) { 1496 // ALOGE("Exceeded buffer length: i (%zu) > len (%zu)", i, mLen); 1497 return; 1498 } 1499 mPos = res; 1500 } 1501 1502 void* getData() const { 1503 return mData; 1504 } 1505 1506 size_t getLength() const { 1507 return mLen; 1508 } 1509 1510 template <typename T> 1511 void add(T t) { 1512 align(sizeof(t)); 1513 if (mPos + sizeof(t) <= mLen) { 1514 memcpy(&mData[mPos], &t, sizeof(t)); 1515 mPos += sizeof(t); 1516 } 1517 } 1518 1519 /* 1520 void add(rs_matrix4x4 m) { 1521 for (size_t i = 0; i < 16; i++) { 1522 add(m.m[i]); 1523 } 1524 } 1525 1526 void add(rs_matrix3x3 m) { 1527 for (size_t i = 0; i < 9; i++) { 1528 add(m.m[i]); 1529 } 1530 } 1531 1532 void add(rs_matrix2x2 m) { 1533 for (size_t i = 0; i < 4; i++) { 1534 add(m.m[i]); 1535 } 1536 } 1537 */ 1538 1539 void add(const sp<BaseObj>& obj) { 1540 if (obj != NULL) { 1541 add((uint32_t) (uintptr_t) obj->getID()); 1542 } else { 1543 add((uint32_t) 0); 1544 } 1545 } 1546 }; 1547 1548 /** 1549 * A Type describes the Element and dimensions used for an Allocation or a 1550 * parallel operation. 1551 * 1552 * A Type always includes an Element and an X dimension. A Type may be 1553 * multidimensional, up to three dimensions. A nonzero value in the Y or Z 1554 * dimensions indicates that the dimension is present. Note that a Type with 1555 * only a given X dimension and a Type with the same X dimension but Y = 1 are 1556 * not equivalent. 1557 * 1558 * A Type also supports inclusion of level of detail (LOD) or cube map 1559 * faces. LOD and cube map faces are booleans to indicate present or not 1560 * present. 1561 * 1562 * A Type also supports YUV format information to support an Allocation in a YUV 1563 * format. The YUV formats supported are RS_YUV_YV12 and RS_YUV_NV21. 1564 */ 1565 class Type : public BaseObj { 1566 protected: 1567 friend class Allocation; 1568 1569 uint32_t mDimX; 1570 uint32_t mDimY; 1571 uint32_t mDimZ; 1572 RsYuvFormat mYuvFormat; 1573 bool mDimMipmaps; 1574 bool mDimFaces; 1575 size_t mElementCount; 1576 sp<const Element> mElement; 1577 1578 Type(void *id, sp<RS> rs); 1579 1580 void calcElementCount(); 1581 virtual void updateFromNative(); 1582 1583 public: 1584 1585 /** 1586 * Returns the YUV format. 1587 * @return YUV format of the Allocation 1588 */ 1589 RsYuvFormat getYuvFormat() const { 1590 return mYuvFormat; 1591 } 1592 1593 /** 1594 * Returns the Element of the Allocation. 1595 * @return YUV format of the Allocation 1596 */ 1597 sp<const Element> getElement() const { 1598 return mElement; 1599 } 1600 1601 /** 1602 * Returns the X dimension of the Allocation. 1603 * @return X dimension of the allocation 1604 */ 1605 uint32_t getX() const { 1606 return mDimX; 1607 } 1608 1609 /** 1610 * Returns the Y dimension of the Allocation. 1611 * @return Y dimension of the allocation 1612 */ 1613 uint32_t getY() const { 1614 return mDimY; 1615 } 1616 1617 /** 1618 * Returns the Z dimension of the Allocation. 1619 * @return Z dimension of the allocation 1620 */ 1621 uint32_t getZ() const { 1622 return mDimZ; 1623 } 1624 1625 /** 1626 * Returns true if the Allocation has mipmaps. 1627 * @return true if the Allocation has mipmaps 1628 */ 1629 bool hasMipmaps() const { 1630 return mDimMipmaps; 1631 } 1632 1633 /** 1634 * Returns true if the Allocation is a cube map 1635 * @return true if the Allocation is a cube map 1636 */ 1637 bool hasFaces() const { 1638 return mDimFaces; 1639 } 1640 1641 /** 1642 * Returns number of accessible Elements in the Allocation 1643 * @return number of accessible Elements in the Allocation 1644 */ 1645 size_t getCount() const { 1646 return mElementCount; 1647 } 1648 1649 /** 1650 * Returns size in bytes of all Elements in the Allocation 1651 * @return size in bytes of all Elements in the Allocation 1652 */ 1653 size_t getSizeBytes() const { 1654 return mElementCount * mElement->getSizeBytes(); 1655 } 1656 1657 /** 1658 * Creates a new Type with the given Element and dimensions. 1659 * @param[in] rs RenderScript context 1660 * @param[in] e Element 1661 * @param[in] dimX X dimension 1662 * @param[in] dimY Y dimension 1663 * @param[in] dimZ Z dimension 1664 * @return new Type 1665 */ 1666 static sp<const Type> create(const sp<RS>& rs, const sp<const Element>& e, uint32_t dimX, uint32_t dimY, uint32_t dimZ); 1667 1668 class Builder { 1669 protected: 1670 RS* mRS; 1671 uint32_t mDimX; 1672 uint32_t mDimY; 1673 uint32_t mDimZ; 1674 RsYuvFormat mYuvFormat; 1675 bool mDimMipmaps; 1676 bool mDimFaces; 1677 sp<const Element> mElement; 1678 1679 public: 1680 Builder(sp<RS> rs, sp<const Element> e); 1681 1682 void setX(uint32_t value); 1683 void setY(uint32_t value); 1684 void setZ(uint32_t value); 1685 void setYuvFormat(RsYuvFormat format); 1686 void setMipmaps(bool value); 1687 void setFaces(bool value); 1688 sp<const Type> create(); 1689 }; 1690 1691 }; 1692 1693 /** 1694 * The parent class for all executable Scripts. This should not be used by applications. 1695 */ 1696 class Script : public BaseObj { 1697 private: 1698 1699 protected: 1700 Script(void *id, sp<RS> rs); 1701 void forEach(uint32_t slot, const sp<const Allocation>& in, const sp<const Allocation>& out, 1702 const void *v, size_t) const; 1703 void bindAllocation(const sp<Allocation>& va, uint32_t slot) const; 1704 void setVar(uint32_t index, const void *, size_t len) const; 1705 void setVar(uint32_t index, const sp<const BaseObj>& o) const; 1706 void invoke(uint32_t slot, const void *v, size_t len) const; 1707 1708 1709 void invoke(uint32_t slot) const { 1710 invoke(slot, NULL, 0); 1711 } 1712 void setVar(uint32_t index, float v) const { 1713 setVar(index, &v, sizeof(v)); 1714 } 1715 void setVar(uint32_t index, double v) const { 1716 setVar(index, &v, sizeof(v)); 1717 } 1718 void setVar(uint32_t index, int32_t v) const { 1719 setVar(index, &v, sizeof(v)); 1720 } 1721 void setVar(uint32_t index, uint32_t v) const { 1722 setVar(index, &v, sizeof(v)); 1723 } 1724 void setVar(uint32_t index, int64_t v) const { 1725 setVar(index, &v, sizeof(v)); 1726 } 1727 void setVar(uint32_t index, bool v) const { 1728 setVar(index, &v, sizeof(v)); 1729 } 1730 1731 public: 1732 class FieldBase { 1733 protected: 1734 sp<const Element> mElement; 1735 sp<Allocation> mAllocation; 1736 1737 void init(const sp<RS>& rs, uint32_t dimx, uint32_t usages = 0); 1738 1739 public: 1740 sp<const Element> getElement() { 1741 return mElement; 1742 } 1743 1744 sp<const Type> getType() { 1745 return mAllocation->getType(); 1746 } 1747 1748 sp<const Allocation> getAllocation() { 1749 return mAllocation; 1750 } 1751 1752 //void updateAllocation(); 1753 }; 1754 }; 1755 1756 /** 1757 * The parent class for all user-defined scripts. This is intended to be used by auto-generated code only. 1758 */ 1759 class ScriptC : public Script { 1760 protected: 1761 ScriptC(sp<RS> rs, 1762 const void *codeTxt, size_t codeLength, 1763 const char *cachedName, size_t cachedNameLength, 1764 const char *cacheDir, size_t cacheDirLength); 1765 1766 }; 1767 1768 /** 1769 * The parent class for all script intrinsics. Intrinsics provide highly optimized implementations of 1770 * basic functions. This is not intended to be used directly. 1771 */ 1772 class ScriptIntrinsic : public Script { 1773 protected: 1774 sp<const Element> mElement; 1775 ScriptIntrinsic(sp<RS> rs, int id, sp<const Element> e); 1776 virtual ~ScriptIntrinsic(); 1777 }; 1778 1779 /** 1780 * Intrinsic for converting RGB to RGBA by using a 3D lookup table. The incoming 1781 * r,g,b values are use as normalized x,y,z coordinates into a 3D 1782 * allocation. The 8 nearest values are sampled and linearly interpolated. The 1783 * result is placed in the output. 1784 */ 1785 class ScriptIntrinsic3DLUT : public ScriptIntrinsic { 1786 private: 1787 ScriptIntrinsic3DLUT(sp<RS> rs, sp<const Element> e); 1788 public: 1789 /** 1790 * Supported Element types are U8_4. Default lookup table is identity. 1791 * @param[in] rs RenderScript context 1792 * @param[in] e Element 1793 * @return new ScriptIntrinsic 1794 */ 1795 static sp<ScriptIntrinsic3DLUT> create(const sp<RS>& rs, const sp<const Element>& e); 1796 1797 /** 1798 * Launch the intrinsic. 1799 * @param[in] ain input Allocation 1800 * @param[in] aout output Allocation 1801 */ 1802 void forEach(const sp<Allocation>& ain, const sp<Allocation>& aout); 1803 1804 /** 1805 * Sets the lookup table. The lookup table must use the same Element as the 1806 * intrinsic. 1807 * @param[in] lut new lookup table 1808 */ 1809 void setLUT(const sp<Allocation>& lut); 1810 }; 1811 1812 1813 /** 1814 * Intrinsic kernel provides high performance RenderScript APIs to BLAS. 1815 * 1816 * The BLAS (Basic Linear Algebra Subprograms) are routines that provide standard 1817 * building blocks for performing basic vector and matrix operations. 1818 * 1819 * For detailed description of BLAS, please refer to http://www.netlib.org/blas/ 1820 * 1821 **/ 1822 class ScriptIntrinsicBLAS : public ScriptIntrinsic { 1823 private: 1824 ScriptIntrinsicBLAS(sp<RS> rs, sp<const Element> e); 1825 public: 1826 /** 1827 * Create an intrinsic to access BLAS subroutines. 1828 * 1829 * @param rs The RenderScript context 1830 * @return ScriptIntrinsicBLAS 1831 */ 1832 static sp<ScriptIntrinsicBLAS> create(const sp<RS>& rs); 1833 1834 /** 1835 * SGEMV performs one of the matrix-vector operations 1836 * y := alpha*A*x + beta*y or y := alpha*A**T*x + beta*y 1837 * 1838 * Details: http://www.netlib.org/lapack/explore-html/db/d58/sgemv_8f.html 1839 * 1840 * @param TransA The type of transpose applied to matrix A. 1841 * @param alpha The scalar alpha. 1842 * @param A The input allocation contains matrix A, supported elements type: {Element#F32}. 1843 * @param X The input allocation contains vector x, supported elements type: {Element#F32}. 1844 * @param incX The increment for the elements of vector x, must be larger than zero. 1845 * @param beta The scalar beta. 1846 * @param Y The input allocation contains vector y, supported elements type: {Element#F32}. 1847 * @param incY The increment for the elements of vector y, must be larger than zero. 1848 */ 1849 void SGEMV(RsBlasTranspose TransA, 1850 float alpha, const sp<Allocation>& A, const sp<Allocation>& X, int incX, 1851 float beta, const sp<Allocation>& Y, int incY); 1852 1853 /** 1854 * DGEMV performs one of the matrix-vector operations 1855 * y := alpha*A*x + beta*y or y := alpha*A**T*x + beta*y 1856 * 1857 * Details: http://www.netlib.org/lapack/explore-html/dc/da8/dgemv_8f.html 1858 * 1859 * @param TransA The type of transpose applied to matrix A. 1860 * @param alpha The scalar alpha. 1861 * @param A The input allocation contains matrix A, supported elements type: {Element#F64}. 1862 * @param X The input allocation contains vector x, supported elements type: {Element#F64}. 1863 * @param incX The increment for the elements of vector x, must be larger than zero. 1864 * @param beta The scalar beta. 1865 * @param Y The input allocation contains vector y, supported elements type: {Element#F64}. 1866 * @param incY The increment for the elements of vector y, must be larger than zero. 1867 */ 1868 void DGEMV(RsBlasTranspose TransA, 1869 double alpha, const sp<Allocation>& A, const sp<Allocation>& X, int incX, 1870 double beta, const sp<Allocation>& Y, int incY); 1871 1872 /** 1873 * CGEMV performs one of the matrix-vector operations 1874 * y := alpha*A*x + beta*y or y := alpha*A**T*x + beta*y or y := alpha*A**H*x + beta*y 1875 * 1876 * Details: http://www.netlib.org/lapack/explore-html/d4/d8a/cgemv_8f.html 1877 * 1878 * @param TransA The type of transpose applied to matrix A. 1879 * @param alpha The scalar alpha. 1880 * @param A The input allocation contains matrix A, supported elements type: {Element#F32_2}. 1881 * @param X The input allocation contains vector x, supported elements type: {Element#F32_2}. 1882 * @param incX The increment for the elements of vector x, must be larger than zero. 1883 * @param beta The scalar beta. 1884 * @param Y The input allocation contains vector y, supported elements type: {Element#F32_2}. 1885 * @param incY The increment for the elements of vector y, must be larger than zero. 1886 */ 1887 void CGEMV(RsBlasTranspose TransA, 1888 Float2 alpha, const sp<Allocation>& A, const sp<Allocation>& X, int incX, 1889 Float2 beta, const sp<Allocation>& Y, int incY); 1890 1891 /** 1892 * ZGEMV performs one of the matrix-vector operations 1893 * y := alpha*A*x + beta*y or y := alpha*A**T*x + beta*y or y := alpha*A**H*x + beta*y 1894 * 1895 * Details: http://www.netlib.org/lapack/explore-html/db/d40/zgemv_8f.html 1896 * 1897 * @param TransA The type of transpose applied to matrix A. 1898 * @param alpha The scalar alpha. 1899 * @param A The input allocation contains matrix A, supported elements type: {Element#F64_2}. 1900 * @param X The input allocation contains vector x, supported elements type: {Element#F64_2}. 1901 * @param incX The increment for the elements of vector x, must be larger than zero. 1902 * @param beta The scalar beta. 1903 * @param Y The input allocation contains vector y, supported elements type: {Element#F64_2}. 1904 * @param incY The increment for the elements of vector y, must be larger than zero. 1905 */ 1906 void ZGEMV(RsBlasTranspose TransA, 1907 Double2 alpha, const sp<Allocation>& A, const sp<Allocation>& X, int incX, 1908 Double2 beta, const sp<Allocation>& Y, int incY); 1909 1910 /** 1911 * SGBMV performs one of the matrix-vector operations 1912 * y := alpha*A*x + beta*y or y := alpha*A**T*x + beta*y 1913 * 1914 * Details: http://www.netlib.org/lapack/explore-html/d6/d46/sgbmv_8f.html 1915 * 1916 * Note: For a M*N matrix, the input Allocation should also be of size M*N (dimY = M, dimX = N), 1917 * but only the region M*(KL+KU+1) will be referenced. The following subroutine can is an 1918 * example showing how to convert the original matrix 'a' to row-based band matrix 'b'. 1919 * for i in range(0, m): 1920 * for j in range(max(0, i-kl), min(i+ku+1, n)): 1921 * b[i, j-i+kl] = a[i, j] 1922 * 1923 * @param TransA The type of transpose applied to matrix A. 1924 * @param KL The number of sub-diagonals of the matrix A. 1925 * @param KU The number of super-diagonals of the matrix A. 1926 * @param alpha The scalar alpha. 1927 * @param A The input allocation contains the band matrix A, supported elements type: {Element#F32}. 1928 * @param X The input allocation contains vector x, supported elements type: {Element#F32}. 1929 * @param incX The increment for the elements of vector x, must be larger than zero. 1930 * @param beta The scalar beta. 1931 * @param Y The input allocation contains vector y, supported elements type: {Element#F32}. 1932 * @param incY The increment for the elements of vector y, must be larger than zero. 1933 */ 1934 void SGBMV(RsBlasTranspose TransA, 1935 int KL, int KU, float alpha, const sp<Allocation>& A, const sp<Allocation>& X, int incX, 1936 float beta, const sp<Allocation>& Y, int incY); 1937 1938 /** 1939 * DGBMV performs one of the matrix-vector operations 1940 * y := alpha*A*x + beta*y or y := alpha*A**T*x + beta*y 1941 * 1942 * Details: http://www.netlib.org/lapack/explore-html/d2/d3f/dgbmv_8f.html 1943 * 1944 * Note: For a M*N matrix, the input Allocation should also be of size M*N (dimY = M, dimX = N), 1945 * but only the region M*(KL+KU+1) will be referenced. The following subroutine can is an 1946 * example showing how to convert the original matrix 'a' to row-based band matrix 'b'. 1947 * for i in range(0, m): 1948 * for j in range(max(0, i-kl), min(i+ku+1, n)): 1949 * b[i, j-i+kl] = a[i, j] 1950 * 1951 * @param TransA The type of transpose applied to matrix A. 1952 * @param KL The number of sub-diagonals of the matrix A. 1953 * @param KU The number of super-diagonals of the matrix A. 1954 * @param alpha The scalar alpha. 1955 * @param A The input allocation contains the band matrix A, supported elements type: {Element#F64}. 1956 * @param X The input allocation contains vector x, supported elements type: {Element#F64}. 1957 * @param incX The increment for the elements of vector x, must be larger than zero. 1958 * @param beta The scalar beta. 1959 * @param Y The input allocation contains vector y, supported elements type: {Element#F64}. 1960 * @param incY The increment for the elements of vector y, must be larger than zero. 1961 */ 1962 void DGBMV(RsBlasTranspose TransA, 1963 int KL, int KU, double alpha, const sp<Allocation>& A, const sp<Allocation>& X, 1964 int incX, double beta, const sp<Allocation>& Y, int incY); 1965 1966 /** 1967 * CGBMV performs one of the matrix-vector operations 1968 * y := alpha*A*x + beta*y or y := alpha*A**T*x + beta*y or y := alpha*A**H*x + beta*y 1969 * 1970 * Details: http://www.netlib.org/lapack/explore-html/d0/d75/cgbmv_8f.html 1971 * 1972 * Note: For a M*N matrix, the input Allocation should also be of size M*N (dimY = M, dimX = N), 1973 * but only the region M*(KL+KU+1) will be referenced. The following subroutine can is an 1974 * example showing how to convert the original matrix 'a' to row-based band matrix 'b'. 1975 * for i in range(0, m): 1976 * for j in range(max(0, i-kl), min(i+ku+1, n)): 1977 * b[i, j-i+kl] = a[i, j] 1978 * 1979 * @param TransA The type of transpose applied to matrix A. 1980 * @param KL The number of sub-diagonals of the matrix A. 1981 * @param KU The number of super-diagonals of the matrix A. 1982 * @param alpha The scalar alpha. 1983 * @param A The input allocation contains the band matrix A, supported elements type: {Element#F32_2}. 1984 * @param X The input allocation contains vector x, supported elements type: {Element#F32_2}. 1985 * @param incX The increment for the elements of vector x, must be larger than zero. 1986 * @param beta The scalar beta. 1987 * @param Y The input allocation contains vector y, supported elements type: {Element#F32_2}. 1988 * @param incY The increment for the elements of vector y, must be larger than zero. 1989 */ 1990 void CGBMV(RsBlasTranspose TransA, 1991 int KL, int KU, Float2 alpha, const sp<Allocation>& A, const sp<Allocation>& X, 1992 int incX, Float2 beta, const sp<Allocation>& Y, int incY); 1993 1994 /** 1995 * ZGBMV performs one of the matrix-vector operations 1996 * y := alpha*A*x + beta*y or y := alpha*A**T*x + beta*y or y := alpha*A**H*x + beta*y 1997 * 1998 * Details: http://www.netlib.org/lapack/explore-html/d9/d46/zgbmv_8f.html 1999 * 2000 * Note: For a M*N matrix, the input Allocation should also be of size M*N (dimY = M, dimX = N), 2001 * but only the region M*(KL+KU+1) will be referenced. The following subroutine can is an 2002 * example showing how to convert the original matrix 'a' to row-based band matrix 'b'. 2003 * for i in range(0, m): 2004 * for j in range(max(0, i-kl), min(i+ku+1, n)): 2005 * b[i, j-i+kl] = a[i, j] 2006 * 2007 * @param TransA The type of transpose applied to matrix A. 2008 * @param KL The number of sub-diagonals of the matrix A. 2009 * @param KU The number of super-diagonals of the matrix A. 2010 * @param alpha The scalar alpha. 2011 * @param A The input allocation contains the band matrix A, supported elements type: {Element#F64_2}. 2012 * @param X The input allocation contains vector x, supported elements type: {Element#F64_2}. 2013 * @param incX The increment for the elements of vector x, must be larger than zero. 2014 * @param beta The scalar beta. 2015 * @param Y The input allocation contains vector y, supported elements type: {Element#F64_2}. 2016 * @param incY The increment for the elements of vector y, must be larger than zero. 2017 */ 2018 void ZGBMV(RsBlasTranspose TransA, 2019 int KL, int KU, Double2 alpha, const sp<Allocation>& A, const sp<Allocation>& X, int incX, 2020 Double2 beta, const sp<Allocation>& Y, int incY); 2021 2022 /** 2023 * STRMV performs one of the matrix-vector operations 2024 * x := A*x or x := A**T*x 2025 * 2026 * Details: http://www.netlib.org/lapack/explore-html/de/d45/strmv_8f.html 2027 * 2028 * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. 2029 * @param TransA The type of transpose applied to matrix A. 2030 * @param Diag Specifies whether or not A is unit triangular. 2031 * @param A The input allocation contains matrix A, supported elements type: {Element#F32}. 2032 * @param X The input allocation contains vector x, supported elements type: {Element#F32}. 2033 * @param incX The increment for the elements of vector x, must be larger than zero. 2034 */ 2035 void STRMV(RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 2036 const sp<Allocation>& A, const sp<Allocation>& X, int incX); 2037 2038 /** 2039 * DTRMV performs one of the matrix-vector operations 2040 * x := A*x or x := A**T*x 2041 * 2042 * Details: http://www.netlib.org/lapack/explore-html/dc/d7e/dtrmv_8f.html 2043 * 2044 * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. 2045 * @param TransA The type of transpose applied to matrix A. 2046 * @param Diag Specifies whether or not A is unit triangular. 2047 * @param A The input allocation contains matrix A, supported elements type: {Element#F64}. 2048 * @param X The input allocation contains vector x, supported elements type: {Element#F64}. 2049 * @param incX The increment for the elements of vector x, must be larger than zero. 2050 */ 2051 void DTRMV(RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 2052 const sp<Allocation>& A, const sp<Allocation>& X, int incX); 2053 2054 /** 2055 * CTRMV performs one of the matrix-vector operations 2056 * x := A*x or x := A**T*x or x := A**H*x 2057 * 2058 * Details: http://www.netlib.org/lapack/explore-html/df/d78/ctrmv_8f.html 2059 * 2060 * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. 2061 * @param TransA The type of transpose applied to matrix A. 2062 * @param Diag Specifies whether or not A is unit triangular. 2063 * @param A The input allocation contains matrix A, supported elements type: {Element#F32_2}. 2064 * @param X The input allocation contains vector x, supported elements type: {Element#F32_2}. 2065 * @param incX The increment for the elements of vector x, must be larger than zero. 2066 */ 2067 void CTRMV(RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 2068 const sp<Allocation>& A, const sp<Allocation>& X, int incX); 2069 2070 /** 2071 * ZTRMV performs one of the matrix-vector operations 2072 * x := A*x or x := A**T*x or x := A**H*x 2073 * 2074 * Details: http://www.netlib.org/lapack/explore-html/d0/dd1/ztrmv_8f.html 2075 * 2076 * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. 2077 * @param TransA The type of transpose applied to matrix A. 2078 * @param Diag Specifies whether or not A is unit triangular. 2079 * @param A The input allocation contains matrix A, supported elements type: {Element#F64_2}. 2080 * @param X The input allocation contains vector x, supported elements type: {Element#F64_2}. 2081 * @param incX The increment for the elements of vector x, must be larger than zero. 2082 */ 2083 void ZTRMV(RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 2084 const sp<Allocation>& A, const sp<Allocation>& X, int incX); 2085 2086 /** 2087 * STBMV performs one of the matrix-vector operations 2088 * x := A*x or x := A**T*x 2089 * 2090 * Details: http://www.netlib.org/lapack/explore-html/d6/d7d/stbmv_8f.html 2091 * 2092 * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N), 2093 * but only the region N*(K+1) will be referenced. The following subroutine can is an 2094 * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'. 2095 * for i in range(0, n): 2096 * for j in range(i, min(i+k+1, n)): 2097 * b[i, j-i] = a[i, j] 2098 * 2099 * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. 2100 * @param TransA The type of transpose applied to matrix A. 2101 * @param Diag Specifies whether or not A is unit triangular. 2102 * @param K The number of off-diagonals of the matrix A 2103 * @param A The input allocation contains matrix A, supported elements type: {Element#F32}. 2104 * @param X The input allocation contains vector x, supported elements type: {Element#F32}. 2105 * @param incX The increment for the elements of vector x, must be larger than zero. 2106 */ 2107 void STBMV(RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 2108 int K, const sp<Allocation>& A, const sp<Allocation>& X, int incX); 2109 2110 /** 2111 * DTBMV performs one of the matrix-vector operations 2112 * x := A*x or x := A**T*x 2113 * 2114 * Details: http://www.netlib.org/lapack/explore-html/df/d29/dtbmv_8f.html 2115 * 2116 * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N), 2117 * but only the region N*(K+1) will be referenced. The following subroutine can is an 2118 * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'. 2119 * for i in range(0, n): 2120 * for j in range(i, min(i+k+1, n)): 2121 * b[i, j-i] = a[i, j] 2122 * 2123 * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. 2124 * @param TransA The type of transpose applied to matrix A. 2125 * @param Diag Specifies whether or not A is unit triangular. 2126 * @param K The number of off-diagonals of the matrix A 2127 * @param A The input allocation contains matrix A, supported elements type: {Element#F64}. 2128 * @param X The input allocation contains vector x, supported elements type: {Element#F64}. 2129 * @param incX The increment for the elements of vector x, must be larger than zero. 2130 */ 2131 void DTBMV(RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 2132 int K, const sp<Allocation>& A, const sp<Allocation>& X, int incX); 2133 2134 /** 2135 * CTBMV performs one of the matrix-vector operations 2136 * x := A*x or x := A**T*x or x := A**H*x 2137 * 2138 * Details: http://www.netlib.org/lapack/explore-html/d3/dcd/ctbmv_8f.html 2139 * 2140 * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N), 2141 * but only the region N*(K+1) will be referenced. The following subroutine can is an 2142 * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'. 2143 * for i in range(0, n): 2144 * for j in range(i, min(i+k+1, n)): 2145 * b[i, j-i] = a[i, j] 2146 * 2147 * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. 2148 * @param TransA The type of transpose applied to matrix A. 2149 * @param Diag Specifies whether or not A is unit triangular. 2150 * @param K The number of off-diagonals of the matrix A 2151 * @param A The input allocation contains matrix A, supported elements type: {Element#F32_2}. 2152 * @param X The input allocation contains vector x, supported elements type: {Element#F32_2}. 2153 * @param incX The increment for the elements of vector x, must be larger than zero. 2154 */ 2155 void CTBMV(RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 2156 int K, const sp<Allocation>& A, const sp<Allocation>& X, int incX); 2157 2158 /** 2159 * ZTBMV performs one of the matrix-vector operations 2160 * x := A*x or x := A**T*x or x := A**H*x 2161 * 2162 * Details: http://www.netlib.org/lapack/explore-html/d3/d39/ztbmv_8f.html 2163 * 2164 * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N), 2165 * but only the region N*(K+1) will be referenced. The following subroutine can is an 2166 * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'. 2167 * for i in range(0, n): 2168 * for j in range(i, min(i+k+1, n)): 2169 * b[i, j-i] = a[i, j] 2170 * 2171 * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. 2172 * @param TransA The type of transpose applied to matrix A. 2173 * @param Diag Specifies whether or not A is unit triangular. 2174 * @param K The number of off-diagonals of the matrix A 2175 * @param A The input allocation contains matrix A, supported elements type: {Element#F64_2}. 2176 * @param X The input allocation contains vector x, supported elements type: {Element#F64_2}. 2177 * @param incX The increment for the elements of vector x, must be larger than zero. 2178 */ 2179 void ZTBMV(RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 2180 int K, const sp<Allocation>& A, const sp<Allocation>& X, int incX); 2181 2182 /** 2183 * STPMV performs one of the matrix-vector operations 2184 * x := A*x or x := A**T*x 2185 * 2186 * Details: http://www.netlib.org/lapack/explore-html/db/db1/stpmv_8f.html 2187 * 2188 * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, 2189 * The following subroutine can is an example showing how to convert a UPPER trianglar matrix 2190 * 'a' to packed matrix 'b'. 2191 * k = 0 2192 * for i in range(0, n): 2193 * for j in range(i, n): 2194 * b[k++] = a[i, j] 2195 * 2196 * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. 2197 * @param TransA The type of transpose applied to matrix A. 2198 * @param Diag Specifies whether or not A is unit triangular. 2199 * @param Ap The input allocation contains packed matrix A, supported elements type: {Element#F32}. 2200 * @param X The input allocation contains vector x, supported elements type: {Element#F32}. 2201 * @param incX The increment for the elements of vector x, must be larger than zero. 2202 */ 2203 void STPMV(RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 2204 const sp<Allocation>& Ap, const sp<Allocation>& X, int incX); 2205 2206 /** 2207 * DTPMV performs one of the matrix-vector operations 2208 * x := A*x or x := A**T*x 2209 * 2210 * Details: http://www.netlib.org/lapack/explore-html/dc/dcd/dtpmv_8f.html 2211 * 2212 * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, 2213 * The following subroutine can is an example showing how to convert a UPPER trianglar matrix 2214 * 'a' to packed matrix 'b'. 2215 * k = 0 2216 * for i in range(0, n): 2217 * for j in range(i, n): 2218 * b[k++] = a[i, j] 2219 * 2220 * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. 2221 * @param TransA The type of transpose applied to matrix A. 2222 * @param Diag Specifies whether or not A is unit triangular. 2223 * @param Ap The input allocation contains packed matrix A, supported elements type: {Element#F64}. 2224 * @param X The input allocation contains vector x, supported elements type: {Element#F64}. 2225 * @param incX The increment for the elements of vector x, must be larger than zero. 2226 */ 2227 void DTPMV(RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 2228 const sp<Allocation>& Ap, const sp<Allocation>& X, int incX); 2229 2230 /** 2231 * CTPMV performs one of the matrix-vector operations 2232 * x := A*x or x := A**T*x or x := A**H*x 2233 * 2234 * Details: http://www.netlib.org/lapack/explore-html/d4/dbb/ctpmv_8f.html 2235 * 2236 * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, 2237 * The following subroutine can is an example showing how to convert a UPPER trianglar matrix 2238 * 'a' to packed matrix 'b'. 2239 * k = 0 2240 * for i in range(0, n): 2241 * for j in range(i, n): 2242 * b[k++] = a[i, j] 2243 * 2244 * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. 2245 * @param TransA The type of transpose applied to matrix A. 2246 * @param Diag Specifies whether or not A is unit triangular. 2247 * @param Ap The input allocation contains packed matrix A, supported elements type: {Element#F32_2}. 2248 * @param X The input allocation contains vector x, supported elements type: {Element#F32_2}. 2249 * @param incX The increment for the elements of vector x, must be larger than zero. 2250 */ 2251 void CTPMV(RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 2252 const sp<Allocation>& Ap, const sp<Allocation>& X, int incX); 2253 2254 /** 2255 * ZTPMV performs one of the matrix-vector operations 2256 * x := A*x or x := A**T*x or x := A**H*x 2257 * 2258 * Details: http://www.netlib.org/lapack/explore-html/d2/d9e/ztpmv_8f.html 2259 * 2260 * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, 2261 * The following subroutine can is an example showing how to convert a UPPER trianglar matrix 2262 * 'a' to packed matrix 'b'. 2263 * k = 0 2264 * for i in range(0, n): 2265 * for j in range(i, n): 2266 * b[k++] = a[i, j] 2267 * 2268 * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. 2269 * @param TransA The type of transpose applied to matrix A. 2270 * @param Diag Specifies whether or not A is unit triangular. 2271 * @param Ap The input allocation contains packed matrix A, supported elements type: {Element#F64_2}. 2272 * @param X The input allocation contains vector x, supported elements type: {Element#F64_2}. 2273 * @param incX The increment for the elements of vector x, must be larger than zero. 2274 */ 2275 void ZTPMV(RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 2276 const sp<Allocation>& Ap, const sp<Allocation>& X, int incX); 2277 2278 /** 2279 * STRSV solves one of the systems of equations 2280 * A*x = b or A**T*x = b 2281 * 2282 * Details: http://www.netlib.org/lapack/explore-html/d0/d2a/strsv_8f.html 2283 * 2284 * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. 2285 * @param TransA The type of transpose applied to matrix A. 2286 * @param Diag Specifies whether or not A is unit triangular. 2287 * @param A The input allocation contains matrix A, supported elements type: {Element#F32}. 2288 * @param X The input allocation contains vector x, supported elements type: {Element#F32}. 2289 * @param incX The increment for the elements of vector x, must be larger than zero. 2290 */ 2291 void STRSV(RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 2292 const sp<Allocation>& A, const sp<Allocation>& X, int incX); 2293 2294 /** 2295 * DTRSV solves one of the systems of equations 2296 * A*x = b or A**T*x = b 2297 * 2298 * Details: http://www.netlib.org/lapack/explore-html/d6/d96/dtrsv_8f.html 2299 * 2300 * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. 2301 * @param TransA The type of transpose applied to matrix A. 2302 * @param Diag Specifies whether or not A is unit triangular. 2303 * @param A The input allocation contains matrix A, supported elements type: {Element#F64}. 2304 * @param X The input allocation contains vector x, supported elements type: {Element#F64}. 2305 * @param incX The increment for the elements of vector x, must be larger than zero. 2306 */ 2307 void DTRSV(RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 2308 const sp<Allocation>& A, const sp<Allocation>& X, int incX); 2309 2310 /** 2311 * CTRSV solves one of the systems of equations 2312 * A*x = b or A**T*x = b or A**H*x = b 2313 * 2314 * Details: http://www.netlib.org/lapack/explore-html/d4/dc8/ctrsv_8f.html 2315 * 2316 * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. 2317 * @param TransA The type of transpose applied to matrix A. 2318 * @param Diag Specifies whether or not A is unit triangular. 2319 * @param A The input allocation contains matrix A, supported elements type: {Element#F32_2}. 2320 * @param X The input allocation contains vector x, supported elements type: {Element#F32_2}. 2321 * @param incX The increment for the elements of vector x, must be larger than zero. 2322 */ 2323 void CTRSV(RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 2324 const sp<Allocation>& A, const sp<Allocation>& X, int incX); 2325 2326 /** 2327 * ZTRSV solves one of the systems of equations 2328 * A*x = b or A**T*x = b or A**H*x = b 2329 * 2330 * Details: http://www.netlib.org/lapack/explore-html/d1/d2f/ztrsv_8f.html 2331 * 2332 * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. 2333 * @param TransA The type of transpose applied to matrix A. 2334 * @param Diag Specifies whether or not A is unit triangular. 2335 * @param A The input allocation contains matrix A, supported elements type: {Element#F64_2}. 2336 * @param X The input allocation contains vector x, supported elements type: {Element#F64_2}. 2337 * @param incX The increment for the elements of vector x, must be larger than zero. 2338 */ 2339 void ZTRSV(RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 2340 const sp<Allocation>& A, const sp<Allocation>& X, int incX); 2341 2342 /** 2343 * STBSV solves one of the systems of equations 2344 * A*x = b or A**T*x = b 2345 * 2346 * Details: http://www.netlib.org/lapack/explore-html/d0/d1f/stbsv_8f.html 2347 * 2348 * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N), 2349 * but only the region N*(K+1) will be referenced. The following subroutine can is an 2350 * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'. 2351 * for i in range(0, n): 2352 * for j in range(i, min(i+k+1, n)): 2353 * b[i, j-i] = a[i, j] 2354 * 2355 * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. 2356 * @param TransA The type of transpose applied to matrix A. 2357 * @param Diag Specifies whether or not A is unit triangular. 2358 * @param K The number of off-diagonals of the matrix A 2359 * @param A The input allocation contains matrix A, supported elements type: {Element#F32}. 2360 * @param X The input allocation contains vector x, supported elements type: {Element#F32}. 2361 * @param incX The increment for the elements of vector x, must be larger than zero. 2362 */ 2363 void STBSV(RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 2364 int K, const sp<Allocation>& A, const sp<Allocation>& X, int incX); 2365 2366 /** 2367 * DTBSV solves one of the systems of equations 2368 * A*x = b or A**T*x = b 2369 * 2370 * Details: http://www.netlib.org/lapack/explore-html/d4/dcf/dtbsv_8f.html 2371 * 2372 * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N), 2373 * but only the region N*(K+1) will be referenced. The following subroutine can is an 2374 * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'. 2375 * for i in range(0, n): 2376 * for j in range(i, min(i+k+1, n)): 2377 * b[i, j-i] = a[i, j] 2378 * 2379 * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. 2380 * @param TransA The type of transpose applied to matrix A. 2381 * @param Diag Specifies whether or not A is unit triangular. 2382 * @param K The number of off-diagonals of the matrix A 2383 * @param A The input allocation contains matrix A, supported elements type: {Element#F64}. 2384 * @param X The input allocation contains vector x, supported elements type: {Element#F64}. 2385 * @param incX The increment for the elements of vector x, must be larger than zero. 2386 */ 2387 void DTBSV(RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 2388 int K, const sp<Allocation>& A, const sp<Allocation>& X, int incX); 2389 2390 /** 2391 * CTBSV solves one of the systems of equations 2392 * A*x = b or A**T*x = b or A**H*x = b 2393 * 2394 * Details: http://www.netlib.org/lapack/explore-html/d9/d5f/ctbsv_8f.html 2395 * 2396 * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N), 2397 * but only the region N*(K+1) will be referenced. The following subroutine can is an 2398 * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'. 2399 * for i in range(0, n): 2400 * for j in range(i, min(i+k+1, n)): 2401 * b[i, j-i] = a[i, j] 2402 * 2403 * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. 2404 * @param TransA The type of transpose applied to matrix A. 2405 * @param Diag Specifies whether or not A is unit triangular. 2406 * @param K The number of off-diagonals of the matrix A 2407 * @param A The input allocation contains matrix A, supported elements type: {Element#F32_2}. 2408 * @param X The input allocation contains vector x, supported elements type: {Element#F32_2}. 2409 * @param incX The increment for the elements of vector x, must be larger than zero. 2410 */ 2411 void CTBSV(RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 2412 int K, const sp<Allocation>& A, const sp<Allocation>& X, int incX); 2413 2414 /** 2415 * ZTBSV solves one of the systems of equations 2416 * A*x = b or A**T*x = b or A**H*x = b 2417 * 2418 * Details: http://www.netlib.org/lapack/explore-html/d4/d5a/ztbsv_8f.html 2419 * 2420 * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N), 2421 * but only the region N*(K+1) will be referenced. The following subroutine can is an 2422 * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'. 2423 * for i in range(0, n): 2424 * for j in range(i, min(i+k+1, n)): 2425 * b[i, j-i] = a[i, j] 2426 * 2427 * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. 2428 * @param TransA The type of transpose applied to matrix A. 2429 * @param Diag Specifies whether or not A is unit triangular. 2430 * @param K The number of off-diagonals of the matrix A 2431 * @param A The input allocation contains matrix A, supported elements type: {Element#F64_2}. 2432 * @param X The input allocation contains vector x, supported elements type: {Element#F64_2}. 2433 * @param incX The increment for the elements of vector x, must be larger than zero. 2434 */ 2435 void ZTBSV(RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 2436 int K, const sp<Allocation>& A, const sp<Allocation>& X, int incX); 2437 2438 /** 2439 * STPSV solves one of the systems of equations 2440 * A*x = b or A**T*x = b 2441 * 2442 * Details: http://www.netlib.org/lapack/explore-html/d0/d7c/stpsv_8f.html 2443 * 2444 * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, 2445 * The following subroutine can is an example showing how to convert a UPPER trianglar matrix 2446 * 'a' to packed matrix 'b'. 2447 * k = 0 2448 * for i in range(0, n): 2449 * for j in range(i, n): 2450 * b[k++] = a[i, j] 2451 * 2452 * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. 2453 * @param TransA The type of transpose applied to matrix A. 2454 * @param Diag Specifies whether or not A is unit triangular. 2455 * @param Ap The input allocation contains packed matrix A, supported elements type: {Element#F32}. 2456 * @param X The input allocation contains vector x, supported elements type: {Element#F32}. 2457 * @param incX The increment for the elements of vector x, must be larger than zero. 2458 */ 2459 void STPSV(RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 2460 const sp<Allocation>& Ap, const sp<Allocation>& X, int incX); 2461 2462 /** 2463 * DTPSV solves one of the systems of equations 2464 * A*x = b or A**T*x = b 2465 * 2466 * Details: http://www.netlib.org/lapack/explore-html/d9/d84/dtpsv_8f.html 2467 * 2468 * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, 2469 * The following subroutine can is an example showing how to convert a UPPER trianglar matrix 2470 * 'a' to packed matrix 'b'. 2471 * k = 0 2472 * for i in range(0, n): 2473 * for j in range(i, n): 2474 * b[k++] = a[i, j] 2475 * 2476 * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. 2477 * @param TransA The type of transpose applied to matrix A. 2478 * @param Diag Specifies whether or not A is unit triangular. 2479 * @param Ap The input allocation contains packed matrix A, supported elements type: {Element#F64}. 2480 * @param X The input allocation contains vector x, supported elements type: {Element#F64}. 2481 * @param incX The increment for the elements of vector x, must be larger than zero. 2482 */ 2483 void DTPSV(RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 2484 const sp<Allocation>& Ap, const sp<Allocation>& X, int incX); 2485 2486 /** 2487 * CTPSV solves one of the systems of equations 2488 * A*x = b or A**T*x = b or A**H*x = b 2489 * 2490 * Details: http://www.netlib.org/lapack/explore-html/d8/d56/ctpsv_8f.html 2491 * 2492 * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, 2493 * The following subroutine can is an example showing how to convert a UPPER trianglar matrix 2494 * 'a' to packed matrix 'b'. 2495 * k = 0 2496 * for i in range(0, n): 2497 * for j in range(i, n): 2498 * b[k++] = a[i, j] 2499 * 2500 * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. 2501 * @param TransA The type of transpose applied to matrix A. 2502 * @param Diag Specifies whether or not A is unit triangular. 2503 * @param Ap The input allocation contains packed matrix A, supported elements type: {Element#F32_2}. 2504 * @param X The input allocation contains vector x, supported elements type: {Element#F32_2}. 2505 * @param incX The increment for the elements of vector x, must be larger than zero. 2506 */ 2507 void CTPSV(RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 2508 const sp<Allocation>& Ap, const sp<Allocation>& X, int incX); 2509 2510 /** 2511 * ZTPSV solves one of the systems of equations 2512 * A*x = b or A**T*x = b or A**H*x = b 2513 * 2514 * Details: http://www.netlib.org/lapack/explore-html/da/d57/ztpsv_8f.html 2515 * 2516 * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, 2517 * The following subroutine can is an example showing how to convert a UPPER trianglar matrix 2518 * 'a' to packed matrix 'b'. 2519 * k = 0 2520 * for i in range(0, n): 2521 * for j in range(i, n): 2522 * b[k++] = a[i, j] 2523 * 2524 * @param Uplo Specifies whether the matrix is an upper or lower triangular matrix. 2525 * @param TransA The type of transpose applied to matrix A. 2526 * @param Diag Specifies whether or not A is unit triangular. 2527 * @param Ap The input allocation contains packed matrix A, supported elements type: {Element#F64_2}. 2528 * @param X The input allocation contains vector x, supported elements type: {Element#F64_2}. 2529 * @param incX The increment for the elements of vector x, must be larger than zero. 2530 */ 2531 void ZTPSV(RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 2532 const sp<Allocation>& Ap, const sp<Allocation>& X, int incX); 2533 2534 /** 2535 * SSYMV performs the matrix-vector operation 2536 * y := alpha*A*x + beta*y 2537 * 2538 * Details: http://www.netlib.org/lapack/explore-html/d2/d94/ssymv_8f.html 2539 * 2540 * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. 2541 * @param alpha The scalar alpha. 2542 * @param A The input allocation contains matrix A, supported elements type: {Element#F32}. 2543 * @param X The input allocation contains vector x, supported elements type: {Element#F32}. 2544 * @param incX The increment for the elements of vector x, must be larger than zero. 2545 * @param beta The scalar beta. 2546 * @param Y The input allocation contains vector y, supported elements type: {Element#F32}. 2547 * @param incY The increment for the elements of vector y, must be larger than zero. 2548 */ 2549 void SSYMV(RsBlasUplo Uplo, float alpha, const sp<Allocation>& A, const sp<Allocation>& X, 2550 int incX, float beta, const sp<Allocation>& Y, int incY); 2551 2552 /** 2553 * SSBMV performs the matrix-vector operation 2554 * y := alpha*A*x + beta*y 2555 * 2556 * Details: http://www.netlib.org/lapack/explore-html/d3/da1/ssbmv_8f.html 2557 * 2558 * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N), 2559 * but only the region N*(K+1) will be referenced. The following subroutine can is an 2560 * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'. 2561 * for i in range(0, n): 2562 * for j in range(i, min(i+k+1, n)): 2563 * b[i, j-i] = a[i, j] 2564 * 2565 * @param Uplo Specifies whether the upper or lower triangular part of the band matrix A is being supplied. 2566 * @param K The number of off-diagonals of the matrix A 2567 * @param alpha The scalar alpha. 2568 * @param A The input allocation contains matrix A, supported elements type: {Element#F32}. 2569 * @param X The input allocation contains vector x, supported elements type: {Element#F32}. 2570 * @param incX The increment for the elements of vector x, must be larger than zero. 2571 * @param beta The scalar beta. 2572 * @param Y The input allocation contains vector y, supported elements type: {Element#F32}. 2573 * @param incY The increment for the elements of vector y, must be larger than zero. 2574 */ 2575 void SSBMV(RsBlasUplo Uplo, int K, float alpha, const sp<Allocation>& A, const sp<Allocation>& X, 2576 int incX, float beta, const sp<Allocation>& Y, int incY); 2577 2578 /** 2579 * SSPMV performs the matrix-vector operation 2580 * y := alpha*A*x + beta*y 2581 * 2582 * Details: http://www.netlib.org/lapack/explore-html/d8/d68/sspmv_8f.html 2583 * 2584 * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, 2585 * The following subroutine can is an example showing how to convert a UPPER trianglar matrix 2586 * 'a' to packed matrix 'b'. 2587 * k = 0 2588 * for i in range(0, n): 2589 * for j in range(i, n): 2590 * b[k++] = a[i, j] 2591 * 2592 * @param Uplo Specifies whether the upper or lower triangular part of the matrix A is supplied in packed form. 2593 * @param alpha The scalar alpha. 2594 * @param Ap The input allocation contains matrix A, supported elements type: {Element#F32}. 2595 * @param X The input allocation contains vector x, supported elements type: {Element#F32}. 2596 * @param incX The increment for the elements of vector x, must be larger than zero. 2597 * @param beta The scalar beta. 2598 * @param Y The input allocation contains vector y, supported elements type: {Element#F32}. 2599 * @param incY The increment for the elements of vector y, must be larger than zero. 2600 */ 2601 void SSPMV(RsBlasUplo Uplo, float alpha, const sp<Allocation>& Ap, const sp<Allocation>& X, 2602 int incX, float beta, const sp<Allocation>& Y, int incY); 2603 2604 /** 2605 * SGER performs the rank 1 operation 2606 * A := alpha*x*y**T + A 2607 * 2608 * Details: http://www.netlib.org/lapack/explore-html/db/d5c/sger_8f.html 2609 * 2610 * @param alpha The scalar alpha. 2611 * @param X The input allocation contains vector x, supported elements type: {Element#F32}. 2612 * @param incX The increment for the elements of vector x, must be larger than zero. 2613 * @param Y The input allocation contains vector y, supported elements type: {Element#F32}. 2614 * @param incY The increment for the elements of vector y, must be larger than zero. 2615 * @param A The input allocation contains matrix A, supported elements type: {Element#F32}. 2616 */ 2617 void SGER(float alpha, const sp<Allocation>& X, int incX, const sp<Allocation>& Y, int incY, const sp<Allocation>& A); 2618 2619 /** 2620 * SSYR performs the rank 1 operation 2621 * A := alpha*x*x**T + A 2622 * 2623 * Details: http://www.netlib.org/lapack/explore-html/d6/dac/ssyr_8f.html 2624 * 2625 * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. 2626 * @param alpha The scalar alpha. 2627 * @param X The input allocation contains vector x, supported elements type: {Element#F32}. 2628 * @param incX The increment for the elements of vector x, must be larger than zero. 2629 * @param A The input allocation contains matrix A, supported elements type: {Element#F32}. 2630 */ 2631 void SSYR(RsBlasUplo Uplo, float alpha, const sp<Allocation>& X, int incX, const sp<Allocation>& A); 2632 2633 /** 2634 * SSPR performs the rank 1 operation 2635 * A := alpha*x*x**T + A 2636 * 2637 * Details: http://www.netlib.org/lapack/explore-html/d2/d9b/sspr_8f.html 2638 * 2639 * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, 2640 * The following subroutine can is an example showing how to convert a UPPER trianglar matrix 2641 * 'a' to packed matrix 'b'. 2642 * k = 0 2643 * for i in range(0, n): 2644 * for j in range(i, n): 2645 * b[k++] = a[i, j] 2646 * 2647 * @param Uplo Specifies whether the upper or lower triangular part is to be supplied in the packed form. 2648 * @param alpha The scalar alpha. 2649 * @param X The input allocation contains vector x, supported elements type: {Element#F32}. 2650 * @param incX The increment for the elements of vector x, must be larger than zero. 2651 * @param Ap The input allocation contains matrix A, supported elements type: {Element#F32}. 2652 */ 2653 void SSPR(RsBlasUplo Uplo, float alpha, const sp<Allocation>& X, int incX, const sp<Allocation>& Ap); 2654 2655 /** 2656 * SSYR2 performs the symmetric rank 2 operation 2657 * A := alpha*x*y**T + alpha*y*x**T + A 2658 * 2659 * Details: http://www.netlib.org/lapack/explore-html/db/d99/ssyr2_8f.html 2660 * 2661 * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. 2662 * @param alpha The scalar alpha. 2663 * @param X The input allocation contains vector x, supported elements type: {Element#F32}. 2664 * @param incX The increment for the elements of vector x, must be larger than zero. 2665 * @param Y The input allocation contains vector y, supported elements type: {Element#F32}. 2666 * @param incY The increment for the elements of vector y, must be larger than zero. 2667 * @param A The input allocation contains matrix A, supported elements type: {Element#F32}. 2668 */ 2669 void SSYR2(RsBlasUplo Uplo, float alpha, const sp<Allocation>& X, int incX, 2670 const sp<Allocation>& Y, int incY, const sp<Allocation>& A); 2671 2672 /** 2673 * SSPR2 performs the symmetric rank 2 operation 2674 * A := alpha*x*y**T + alpha*y*x**T + A 2675 * 2676 * Details: http://www.netlib.org/lapack/explore-html/db/d3e/sspr2_8f.html 2677 * 2678 * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, 2679 * The following subroutine can is an example showing how to convert a UPPER trianglar matrix 2680 * 'a' to packed matrix 'b'. 2681 * k = 0 2682 * for i in range(0, n): 2683 * for j in range(i, n): 2684 * b[k++] = a[i, j] 2685 * 2686 * @param Uplo Specifies whether the upper or lower triangular part is to be supplied in the packed form. 2687 * @param alpha The scalar alpha. 2688 * @param X The input allocation contains vector x, supported elements type: {Element#F32}. 2689 * @param incX The increment for the elements of vector x, must be larger than zero. 2690 * @param Y The input allocation contains vector y, supported elements type: {Element#F32}. 2691 * @param incY The increment for the elements of vector y, must be larger than zero. 2692 * @param Ap The input allocation contains matrix A, supported elements type: {Element#F32}. 2693 */ 2694 void SSPR2(RsBlasUplo Uplo, float alpha, const sp<Allocation>& X, int incX, 2695 const sp<Allocation>& Y, int incY, const sp<Allocation>& Ap); 2696 2697 /** 2698 * DSYMV performs the matrix-vector operation 2699 * y := alpha*A*x + beta*y 2700 * 2701 * Details: http://www.netlib.org/lapack/explore-html/d8/dbe/dsymv_8f.html 2702 * 2703 * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. 2704 * @param alpha The scalar alpha. 2705 * @param A The input allocation contains matrix A, supported elements type: {Element#F64}. 2706 * @param X The input allocation contains vector x, supported elements type: {Element#F64}. 2707 * @param incX The increment for the elements of vector x, must be larger than zero. 2708 * @param beta The scalar beta. 2709 * @param Y The input allocation contains vector y, supported elements type: {Element#F64}. 2710 * @param incY The increment for the elements of vector y, must be larger than zero. 2711 */ 2712 void DSYMV(RsBlasUplo Uplo, double alpha, const sp<Allocation>& A, const sp<Allocation>& X, int incX, 2713 double beta, const sp<Allocation>& Y, int incY); 2714 2715 /** 2716 * DSBMV performs the matrix-vector operation 2717 * y := alpha*A*x + beta*y 2718 * 2719 * Details: http://www.netlib.org/lapack/explore-html/d8/d1e/dsbmv_8f.html 2720 * 2721 * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N), 2722 * but only the region N*(K+1) will be referenced. The following subroutine can is an 2723 * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'. 2724 * for i in range(0, n): 2725 * for j in range(i, min(i+k+1, n)): 2726 * b[i, j-i] = a[i, j] 2727 * 2728 * @param Uplo Specifies whether the upper or lower triangular part of the band matrix A is being supplied. 2729 * @param K The number of off-diagonals of the matrix A 2730 * @param alpha The scalar alpha. 2731 * @param A The input allocation contains matrix A, supported elements type: {Element#F64}. 2732 * @param X The input allocation contains vector x, supported elements type: {Element#F64}. 2733 * @param incX The increment for the elements of vector x, must be larger than zero. 2734 * @param beta The scalar beta. 2735 * @param Y The input allocation contains vector y, supported elements type: {Element#F64}. 2736 * @param incY The increment for the elements of vector y, must be larger than zero. 2737 */ 2738 void DSBMV(RsBlasUplo Uplo, int K, double alpha, const sp<Allocation>& A, const sp<Allocation>& X, int incX, 2739 double beta, const sp<Allocation>& Y, int incY); 2740 2741 /** 2742 * DSPMV performs the matrix-vector operation 2743 * y := alpha*A*x + beta*y 2744 * 2745 * Details: http://www.netlib.org/lapack/explore-html/d4/d85/dspmv_8f.html 2746 * 2747 * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, 2748 * The following subroutine can is an example showing how to convert a UPPER trianglar matrix 2749 * 'a' to packed matrix 'b'. 2750 * k = 0 2751 * for i in range(0, n): 2752 * for j in range(i, n): 2753 * b[k++] = a[i, j] 2754 * 2755 * @param Uplo Specifies whether the upper or lower triangular part of the matrix A is supplied in packed form. 2756 * @param alpha The scalar alpha. 2757 * @param Ap The input allocation contains matrix A, supported elements type: {Element#F64}. 2758 * @param X The input allocation contains vector x, supported elements type: {Element#F64}. 2759 * @param incX The increment for the elements of vector x, must be larger than zero. 2760 * @param beta The scalar beta. 2761 * @param Y The input allocation contains vector y, supported elements type: {Element#F64}. 2762 * @param incY The increment for the elements of vector y, must be larger than zero. 2763 */ 2764 void DSPMV(RsBlasUplo Uplo, double alpha, const sp<Allocation>& Ap, const sp<Allocation>& X, int incX, 2765 double beta, const sp<Allocation>& Y, int incY); 2766 2767 /** 2768 * DGER performs the rank 1 operation 2769 * A := alpha*x*y**T + A 2770 * 2771 * Details: http://www.netlib.org/lapack/explore-html/dc/da8/dger_8f.html 2772 * 2773 * @param alpha The scalar alpha. 2774 * @param X The input allocation contains vector x, supported elements type: {Element#F64}. 2775 * @param incX The increment for the elements of vector x, must be larger than zero. 2776 * @param Y The input allocation contains vector y, supported elements type: {Element#F64}. 2777 * @param incY The increment for the elements of vector y, must be larger than zero. 2778 * @param A The input allocation contains matrix A, supported elements type: {Element#F64}. 2779 */ 2780 void DGER(double alpha, const sp<Allocation>& X, int incX, const sp<Allocation>& Y, int incY, const sp<Allocation>& A); 2781 2782 /** 2783 * DSYR performs the rank 1 operation 2784 * A := alpha*x*x**T + A 2785 * 2786 * Details: http://www.netlib.org/lapack/explore-html/d3/d60/dsyr_8f.html 2787 * 2788 * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. 2789 * @param alpha The scalar alpha. 2790 * @param X The input allocation contains vector x, supported elements type: {Element#F64}. 2791 * @param incX The increment for the elements of vector x, must be larger than zero. 2792 * @param A The input allocation contains matrix A, supported elements type: {Element#F64}. 2793 */ 2794 void DSYR(RsBlasUplo Uplo, double alpha, const sp<Allocation>& X, int incX, const sp<Allocation>& A); 2795 2796 /** 2797 * DSPR performs the rank 1 operation 2798 * A := alpha*x*x**T + A 2799 * 2800 * Details: http://www.netlib.org/lapack/explore-html/dd/dba/dspr_8f.html 2801 * 2802 * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, 2803 * The following subroutine can is an example showing how to convert a UPPER trianglar matrix 2804 * 'a' to packed matrix 'b'. 2805 * k = 0 2806 * for i in range(0, n): 2807 * for j in range(i, n): 2808 * b[k++] = a[i, j] 2809 * 2810 * @param Uplo Specifies whether the upper or lower triangular part is to be supplied in the packed form. 2811 * @param alpha The scalar alpha. 2812 * @param X The input allocation contains vector x, supported elements type: {Element#F64}. 2813 * @param incX The increment for the elements of vector x, must be larger than zero. 2814 * @param Ap The input allocation contains matrix A, supported elements type: {Element#F64}. 2815 */ 2816 void DSPR(RsBlasUplo Uplo, double alpha, const sp<Allocation>& X, int incX, const sp<Allocation>& Ap); 2817 2818 /** 2819 * DSYR2 performs the symmetric rank 2 operation 2820 * A := alpha*x*y**T + alpha*y*x**T + A 2821 * 2822 * Details: http://www.netlib.org/lapack/explore-html/de/d41/dsyr2_8f.html 2823 * 2824 * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. 2825 * @param alpha The scalar alpha. 2826 * @param X The input allocation contains vector x, supported elements type: {Element#F64}. 2827 * @param incX The increment for the elements of vector x, must be larger than zero. 2828 * @param Y The input allocation contains vector y, supported elements type: {Element#F64}. 2829 * @param incY The increment for the elements of vector y, must be larger than zero. 2830 * @param A The input allocation contains matrix A, supported elements type: {Element#F64}. 2831 */ 2832 void DSYR2(RsBlasUplo Uplo, double alpha, const sp<Allocation>& X, int incX, 2833 const sp<Allocation>& Y, int incY, const sp<Allocation>& A); 2834 2835 /** 2836 * DSPR2 performs the symmetric rank 2 operation 2837 * A := alpha*x*y**T + alpha*y*x**T + A 2838 * 2839 * Details: http://www.netlib.org/lapack/explore-html/dd/d9e/dspr2_8f.html 2840 * 2841 * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, 2842 * The following subroutine can is an example showing how to convert a UPPER trianglar matrix 2843 * 'a' to packed matrix 'b'. 2844 * k = 0 2845 * for i in range(0, n): 2846 * for j in range(i, n): 2847 * b[k++] = a[i, j] 2848 * 2849 * @param Uplo Specifies whether the upper or lower triangular part is to be supplied in the packed form. 2850 * @param alpha The scalar alpha. 2851 * @param X The input allocation contains vector x, supported elements type: {Element#F64}. 2852 * @param incX The increment for the elements of vector x, must be larger than zero. 2853 * @param Y The input allocation contains vector y, supported elements type: {Element#F64}. 2854 * @param incY The increment for the elements of vector y, must be larger than zero. 2855 * @param Ap The input allocation contains matrix A, supported elements type: {Element#F64}. 2856 */ 2857 void DSPR2(RsBlasUplo Uplo, double alpha, const sp<Allocation>& X, int incX, 2858 const sp<Allocation>& Y, int incY, const sp<Allocation>& Ap); 2859 2860 /** 2861 * CHEMV performs the matrix-vector operation 2862 * y := alpha*A*x + beta*y 2863 * 2864 * Details: http://www.netlib.org/lapack/explore-html/d7/d51/chemv_8f.html 2865 * 2866 * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. 2867 * @param alpha The scalar alpha. 2868 * @param A The input allocation contains matrix A, supported elements type: {Element#F32_2}. 2869 * @param X The input allocation contains vector x, supported elements type: {Element#F32_2}. 2870 * @param incX The increment for the elements of vector x, must be larger than zero. 2871 * @param beta The scalar beta. 2872 * @param Y The input allocation contains vector y, supported elements type: {Element#F32_2}. 2873 * @param incY The increment for the elements of vector y, must be larger than zero. 2874 */ 2875 void CHEMV(RsBlasUplo Uplo, Float2 alpha, const sp<Allocation>& A, const sp<Allocation>& X, 2876 int incX, Float2 beta, const sp<Allocation>& Y, int incY); 2877 2878 /** 2879 * CHBMV performs the matrix-vector operation 2880 * y := alpha*A*x + beta*y 2881 * 2882 * Details: http://www.netlib.org/lapack/explore-html/db/dc2/chbmv_8f.html 2883 * 2884 * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N), 2885 * but only the region N*(K+1) will be referenced. The following subroutine can is an 2886 * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'. 2887 * for i in range(0, n): 2888 * for j in range(i, min(i+k+1, n)): 2889 * b[i, j-i] = a[i, j] 2890 * 2891 * @param Uplo Specifies whether the upper or lower triangular part of the band matrix A is being supplied. 2892 * @param K The number of off-diagonals of the matrix A 2893 * @param alpha The scalar alpha. 2894 * @param A The input allocation contains matrix A, supported elements type: {Element#F32_2}. 2895 * @param X The input allocation contains vector x, supported elements type: {Element#F32_2}. 2896 * @param incX The increment for the elements of vector x, must be larger than zero. 2897 * @param beta The scalar beta. 2898 * @param Y The input allocation contains vector y, supported elements type: {Element#F32_2}. 2899 * @param incY The increment for the elements of vector y, must be larger than zero. 2900 */ 2901 void CHBMV(RsBlasUplo Uplo, int K, Float2 alpha, const sp<Allocation>& A, const sp<Allocation>& X, 2902 int incX, Float2 beta, const sp<Allocation>& Y, int incY); 2903 2904 /** 2905 * CHPMV performs the matrix-vector operation 2906 * y := alpha*A*x + beta*y 2907 * 2908 * Details: http://www.netlib.org/lapack/explore-html/d2/d06/chpmv_8f.html 2909 * 2910 * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, 2911 * The following subroutine can is an example showing how to convert a UPPER trianglar matrix 2912 * 'a' to packed matrix 'b'. 2913 * k = 0 2914 * for i in range(0, n): 2915 * for j in range(i, n): 2916 * b[k++] = a[i, j] 2917 * 2918 * @param Uplo Specifies whether the upper or lower triangular part of the matrix A is supplied in packed form. 2919 * @param alpha The scalar alpha. 2920 * @param Ap The input allocation contains matrix A, supported elements type: {Element#F32_2}. 2921 * @param X The input allocation contains vector x, supported elements type: {Element#F32_2}. 2922 * @param incX The increment for the elements of vector x, must be larger than zero. 2923 * @param beta The scalar beta. 2924 * @param Y The input allocation contains vector y, supported elements type: {Element#F32_2}. 2925 * @param incY The increment for the elements of vector y, must be larger than zero. 2926 */ 2927 void CHPMV(RsBlasUplo Uplo, Float2 alpha, const sp<Allocation>& Ap, const sp<Allocation>& X, 2928 int incX, Float2 beta, const sp<Allocation>& Y, int incY); 2929 2930 /** 2931 * CGERU performs the rank 1 operation 2932 * A := alpha*x*y**T + A 2933 * 2934 * Details: http://www.netlib.org/lapack/explore-html/db/d5f/cgeru_8f.html 2935 * 2936 * @param alpha The scalar alpha. 2937 * @param X The input allocation contains vector x, supported elements type: {Element#F32_2}. 2938 * @param incX The increment for the elements of vector x, must be larger than zero. 2939 * @param Y The input allocation contains vector y, supported elements type: {Element#F32_2}. 2940 * @param incY The increment for the elements of vector y, must be larger than zero. 2941 * @param A The input allocation contains matrix A, supported elements type: {Element#F32_2}. 2942 */ 2943 void CGERU(Float2 alpha, const sp<Allocation>& X, int incX, 2944 const sp<Allocation>& Y, int incY, const sp<Allocation>& A); 2945 2946 /** 2947 * CGERC performs the rank 1 operation 2948 * A := alpha*x*y**H + A 2949 * 2950 * Details: http://www.netlib.org/lapack/explore-html/dd/d84/cgerc_8f.html 2951 * 2952 * @param alpha The scalar alpha. 2953 * @param X The input allocation contains vector x, supported elements type: {Element#F32_2}. 2954 * @param incX The increment for the elements of vector x, must be larger than zero. 2955 * @param Y The input allocation contains vector y, supported elements type: {Element#F32_2}. 2956 * @param incY The increment for the elements of vector y, must be larger than zero. 2957 * @param A The input allocation contains matrix A, supported elements type: {Element#F32_2}. 2958 */ 2959 void CGERC(Float2 alpha, const sp<Allocation>& X, int incX, 2960 const sp<Allocation>& Y, int incY, const sp<Allocation>& A); 2961 2962 /** 2963 * CHER performs the rank 1 operation 2964 * A := alpha*x*x**H + A 2965 * 2966 * Details: http://www.netlib.org/lapack/explore-html/d3/d6d/cher_8f.html 2967 * 2968 * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. 2969 * @param alpha The scalar alpha. 2970 * @param X The input allocation contains vector x, supported elements type: {Element#F32_2}. 2971 * @param incX The increment for the elements of vector x, must be larger than zero. 2972 * @param A The input allocation contains matrix A, supported elements type: {Element#F32_2}. 2973 */ 2974 void CHER(RsBlasUplo Uplo, float alpha, const sp<Allocation>& X, int incX, const sp<Allocation>& A); 2975 2976 /** 2977 * CHPR performs the rank 1 operation 2978 * A := alpha*x*x**H + A 2979 * 2980 * Details: http://www.netlib.org/lapack/explore-html/db/dcd/chpr_8f.html 2981 * 2982 * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, 2983 * The following subroutine can is an example showing how to convert a UPPER trianglar matrix 2984 * 'a' to packed matrix 'b'. 2985 * k = 0 2986 * for i in range(0, n): 2987 * for j in range(i, n): 2988 * b[k++] = a[i, j] 2989 * 2990 * @param Uplo Specifies whether the upper or lower triangular part is to be supplied in the packed form. 2991 * @param alpha The scalar alpha. 2992 * @param X The input allocation contains vector x, supported elements type: {Element#F32_2}. 2993 * @param incX The increment for the elements of vector x, must be larger than zero. 2994 * @param Ap The input allocation contains matrix A, supported elements type: {Element#F32_2}. 2995 */ 2996 void CHPR(RsBlasUplo Uplo, float alpha, const sp<Allocation>& X, int incX, const sp<Allocation>& Ap); 2997 2998 /** 2999 * CHER2 performs the symmetric rank 2 operation 3000 * A := alpha*x*y**H + alpha*y*x**H + A 3001 * 3002 * Details: http://www.netlib.org/lapack/explore-html/db/d87/cher2_8f.html 3003 * 3004 * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. 3005 * @param alpha The scalar alpha. 3006 * @param X The input allocation contains vector x, supported elements type: {Element#F32_2}. 3007 * @param incX The increment for the elements of vector x, must be larger than zero. 3008 * @param Y The input allocation contains vector y, supported elements type: {Element#F32_2}. 3009 * @param incY The increment for the elements of vector y, must be larger than zero. 3010 * @param A The input allocation contains matrix A, supported elements type: {Element#F32_2}. 3011 */ 3012 void CHER2(RsBlasUplo Uplo, Float2 alpha, const sp<Allocation>& X, int incX, 3013 const sp<Allocation>& Y, int incY, const sp<Allocation>& A); 3014 3015 /** 3016 * CHPR2 performs the symmetric rank 2 operation 3017 * A := alpha*x*y**H + alpha*y*x**H + A 3018 * 3019 * Details: http://www.netlib.org/lapack/explore-html/d6/d44/chpr2_8f.html 3020 * 3021 * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, 3022 * The following subroutine can is an example showing how to convert a UPPER trianglar matrix 3023 * 'a' to packed matrix 'b'. 3024 * k = 0 3025 * for i in range(0, n): 3026 * for j in range(i, n): 3027 * b[k++] = a[i, j] 3028 * 3029 * @param Uplo Specifies whether the upper or lower triangular part is to be supplied in the packed form. 3030 * @param alpha The scalar alpha. 3031 * @param X The input allocation contains vector x, supported elements type: {Element#F32_2}. 3032 * @param incX The increment for the elements of vector x, must be larger than zero. 3033 * @param Y The input allocation contains vector y, supported elements type: {Element#F32_2}. 3034 * @param incY The increment for the elements of vector y, must be larger than zero. 3035 * @param Ap The input allocation contains matrix A, supported elements type: {Element#F32_2}. 3036 */ 3037 void CHPR2(RsBlasUplo Uplo, Float2 alpha, const sp<Allocation>& X, int incX, 3038 const sp<Allocation>& Y, int incY, const sp<Allocation>& Ap); 3039 3040 /** 3041 * ZHEMV performs the matrix-vector operation 3042 * y := alpha*A*x + beta*y 3043 * 3044 * Details: http://www.netlib.org/lapack/explore-html/d0/ddd/zhemv_8f.html 3045 * 3046 * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. 3047 * @param alpha The scalar alpha. 3048 * @param A The input allocation contains matrix A, supported elements type: {Element#F64_2}. 3049 * @param X The input allocation contains vector x, supported elements type: {Element#F64_2}. 3050 * @param incX The increment for the elements of vector x, must be larger than zero. 3051 * @param beta The scalar beta. 3052 * @param Y The input allocation contains vector y, supported elements type: {Element#F64_2}. 3053 * @param incY The increment for the elements of vector y, must be larger than zero. 3054 */ 3055 void ZHEMV(RsBlasUplo Uplo, Double2 alpha, const sp<Allocation>& A, const sp<Allocation>& X, 3056 int incX, Double2 beta, const sp<Allocation>& Y, int incY); 3057 3058 /** 3059 * ZHBMV performs the matrix-vector operation 3060 * y := alpha*A*x + beta*y 3061 * 3062 * Details: http://www.netlib.org/lapack/explore-html/d3/d1a/zhbmv_8f.html 3063 * 3064 * Note: For a N*N matrix, the input Allocation should also be of size N*N (dimY = N, dimX = N), 3065 * but only the region N*(K+1) will be referenced. The following subroutine can is an 3066 * example showing how to convert a UPPER trianglar matrix 'a' to row-based band matrix 'b'. 3067 * for i in range(0, n): 3068 * for j in range(i, min(i+k+1, n)): 3069 * b[i, j-i] = a[i, j] 3070 * 3071 * @param Uplo Specifies whether the upper or lower triangular part of the band matrix A is being supplied. 3072 * @param K The number of off-diagonals of the matrix A 3073 * @param alpha The scalar alpha. 3074 * @param A The input allocation contains matrix A, supported elements type: {Element#F64_2}. 3075 * @param X The input allocation contains vector x, supported elements type: {Element#F64_2}. 3076 * @param incX The increment for the elements of vector x, must be larger than zero. 3077 * @param beta The scalar beta. 3078 * @param Y The input allocation contains vector y, supported elements type: {Element#F64_2}. 3079 * @param incY The increment for the elements of vector y, must be larger than zero. 3080 */ 3081 void ZHBMV(RsBlasUplo Uplo, int K, Double2 alpha, const sp<Allocation>& A, const sp<Allocation>& X, 3082 int incX, Double2 beta, const sp<Allocation>& Y, int incY); 3083 3084 /** 3085 * ZHPMV performs the matrix-vector operation 3086 * y := alpha*A*x + beta*y 3087 * 3088 * Details: http://www.netlib.org/lapack/explore-html/d0/d60/zhpmv_8f.html 3089 * 3090 * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, 3091 * The following subroutine can is an example showing how to convert a UPPER trianglar matrix 3092 * 'a' to packed matrix 'b'. 3093 * k = 0 3094 * for i in range(0, n): 3095 * for j in range(i, n): 3096 * b[k++] = a[i, j] 3097 * 3098 * @param Uplo Specifies whether the upper or lower triangular part of the matrix A is supplied in packed form. 3099 * @param alpha The scalar alpha. 3100 * @param Ap The input allocation contains matrix A, supported elements type: {Element#F64_2}. 3101 * @param X The input allocation contains vector x, supported elements type: {Element#F64_2}. 3102 * @param incX The increment for the elements of vector x, must be larger than zero. 3103 * @param beta The scalar beta. 3104 * @param Y The input allocation contains vector y, supported elements type: {Element#F64_2}. 3105 * @param incY The increment for the elements of vector y, must be larger than zero. 3106 */ 3107 void ZHPMV(RsBlasUplo Uplo, Double2 alpha, const sp<Allocation>& Ap, const sp<Allocation>& X, 3108 int incX, Double2 beta, const sp<Allocation>& Y, int incY); 3109 3110 /** 3111 * ZGERU performs the rank 1 operation 3112 * A := alpha*x*y**T + A 3113 * 3114 * Details: http://www.netlib.org/lapack/explore-html/d7/d12/zgeru_8f.html 3115 * 3116 * @param alpha The scalar alpha. 3117 * @param X The input allocation contains vector x, supported elements type: {Element#F64_2}. 3118 * @param incX The increment for the elements of vector x, must be larger than zero. 3119 * @param Y The input allocation contains vector y, supported elements type: {Element#F64_2}. 3120 * @param incY The increment for the elements of vector y, must be larger than zero. 3121 * @param A The input allocation contains matrix A, supported elements type: {Element#F64_2}. 3122 */ 3123 void ZGERU(Double2 alpha, const sp<Allocation>& X, int incX, 3124 const sp<Allocation>& Y, int incY, const sp<Allocation>& A); 3125 3126 /** 3127 * ZGERC performs the rank 1 operation 3128 * A := alpha*x*y**H + A 3129 * 3130 * Details: http://www.netlib.org/lapack/explore-html/d3/dad/zgerc_8f.html 3131 * 3132 * @param alpha The scalar alpha. 3133 * @param X The input allocation contains vector x, supported elements type: {Element#F64_2}. 3134 * @param incX The increment for the elements of vector x, must be larger than zero. 3135 * @param Y The input allocation contains vector y, supported elements type: {Element#F64_2}. 3136 * @param incY The increment for the elements of vector y, must be larger than zero. 3137 * @param A The input allocation contains matrix A, supported elements type: {Element#F64_2}. 3138 */ 3139 void ZGERC(Double2 alpha, const sp<Allocation>& X, int incX, 3140 const sp<Allocation>& Y, int incY, const sp<Allocation>& A); 3141 3142 /** 3143 * ZHER performs the rank 1 operation 3144 * A := alpha*x*x**H + A 3145 * 3146 * Details: http://www.netlib.org/lapack/explore-html/de/d0e/zher_8f.html 3147 * 3148 * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. 3149 * @param alpha The scalar alpha. 3150 * @param X The input allocation contains vector x, supported elements type: {Element#F64_2}. 3151 * @param incX The increment for the elements of vector x, must be larger than zero. 3152 * @param A The input allocation contains matrix A, supported elements type: {Element#F64_2}. 3153 */ 3154 void ZHER(RsBlasUplo Uplo, double alpha, const sp<Allocation>& X, int incX, const sp<Allocation>& A); 3155 3156 /** 3157 * ZHPR performs the rank 1 operation 3158 * A := alpha*x*x**H + A 3159 * 3160 * Details: http://www.netlib.org/lapack/explore-html/de/de1/zhpr_8f.html 3161 * 3162 * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, 3163 * The following subroutine can is an example showing how to convert a UPPER trianglar matrix 3164 * 'a' to packed matrix 'b'. 3165 * k = 0 3166 * for i in range(0, n): 3167 * for j in range(i, n): 3168 * b[k++] = a[i, j] 3169 * 3170 * @param Uplo Specifies whether the upper or lower triangular part is to be supplied in the packed form. 3171 * @param alpha The scalar alpha. 3172 * @param X The input allocation contains vector x, supported elements type: {Element#F64_2}. 3173 * @param incX The increment for the elements of vector x, must be larger than zero. 3174 * @param Ap The input allocation contains matrix A, supported elements type: {Element#F64_2}. 3175 */ 3176 void ZHPR(RsBlasUplo Uplo, double alpha, const sp<Allocation>& X, int incX, const sp<Allocation>& Ap); 3177 3178 /** 3179 * ZHER2 performs the symmetric rank 2 operation 3180 * A := alpha*x*y**H + alpha*y*x**H + A 3181 * 3182 * Details: http://www.netlib.org/lapack/explore-html/da/d8a/zher2_8f.html 3183 * 3184 * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. 3185 * @param alpha The scalar alpha. 3186 * @param X The input allocation contains vector x, supported elements type: {Element#F64_2}. 3187 * @param incX The increment for the elements of vector x, must be larger than zero. 3188 * @param Y The input allocation contains vector y, supported elements type: {Element#F64_2}. 3189 * @param incY The increment for the elements of vector y, must be larger than zero. 3190 * @param A The input allocation contains matrix A, supported elements type: {Element#F64_2}. 3191 */ 3192 void ZHER2(RsBlasUplo Uplo, Double2 alpha, const sp<Allocation>& X, int incX, 3193 const sp<Allocation>& Y, int incY, const sp<Allocation>& A); 3194 3195 /** 3196 * ZHPR2 performs the symmetric rank 2 operation 3197 * A := alpha*x*y**H + alpha*y*x**H + A 3198 * 3199 * Details: http://www.netlib.org/lapack/explore-html/d5/d52/zhpr2_8f.html 3200 * 3201 * Note: For a N*N matrix, the input Allocation should be a 1D allocation of size dimX = N*(N+1)/2, 3202 * The following subroutine can is an example showing how to convert a UPPER trianglar matrix 3203 * 'a' to packed matrix 'b'. 3204 * k = 0 3205 * for i in range(0, n): 3206 * for j in range(i, n): 3207 * b[k++] = a[i, j] 3208 * 3209 * @param Uplo Specifies whether the upper or lower triangular part is to be supplied in the packed form. 3210 * @param alpha The scalar alpha. 3211 * @param X The input allocation contains vector x, supported elements type: {Element#F64_2}. 3212 * @param incX The increment for the elements of vector x, must be larger than zero. 3213 * @param Y The input allocation contains vector y, supported elements type: {Element#F64_2}. 3214 * @param incY The increment for the elements of vector y, must be larger than zero. 3215 * @param Ap The input allocation contains matrix A, supported elements type: {Element#F64_2}. 3216 */ 3217 void ZHPR2(RsBlasUplo Uplo, Double2 alpha, const sp<Allocation>& X, int incX, 3218 const sp<Allocation>& Y, int incY, const sp<Allocation>& Ap); 3219 3220 /** 3221 * SGEMM performs one of the matrix-matrix operations 3222 * C := alpha*op(A)*op(B) + beta*C where op(X) is one of op(X) = X or op(X) = X**T 3223 * 3224 * Details: http://www.netlib.org/lapack/explore-html/d4/de2/sgemm_8f.html 3225 * 3226 * @param TransA The type of transpose applied to matrix A. 3227 * @param TransB The type of transpose applied to matrix B. 3228 * @param alpha The scalar alpha. 3229 * @param A The input allocation contains matrix A, supported elements type: {Element#F32}. 3230 * @param B The input allocation contains matrix B, supported elements type: {Element#F32}. 3231 * @param beta The scalar beta. 3232 * @param C The input allocation contains matrix C, supported elements type: {Element#F32}. 3233 */ 3234 void SGEMM(RsBlasTranspose TransA, RsBlasTranspose TransB, float alpha, const sp<Allocation>& A, 3235 const sp<Allocation>& B, float beta, const sp<Allocation>& C); 3236 3237 3238 /** 3239 * DGEMM performs one of the matrix-matrix operations 3240 * C := alpha*op(A)*op(B) + beta*C where op(X) is one of op(X) = X or op(X) = X**T 3241 * 3242 * Details: http://www.netlib.org/lapack/explore-html/d7/d2b/dgemm_8f.html 3243 * 3244 * @param TransA The type of transpose applied to matrix A. 3245 * @param TransB The type of transpose applied to matrix B. 3246 * @param alpha The scalar alpha. 3247 * @param A The input allocation contains matrix A, supported elements type: {Element#F64}. 3248 * @param B The input allocation contains matrix B, supported elements type: {Element#F64}. 3249 * @param beta The scalar beta. 3250 * @param C The input allocation contains matrix C, supported elements type: {Element#F64}. 3251 */ 3252 void DGEMM(RsBlasTranspose TransA, RsBlasTranspose TransB, double alpha, const sp<Allocation>& A, 3253 const sp<Allocation>& B, double beta, const sp<Allocation>& C); 3254 3255 /** 3256 * CGEMM performs one of the matrix-matrix operations 3257 * C := alpha*op(A)*op(B) + beta*C where op(X) is one of op(X) = X or op(X) = X**T or op(X) = X**H 3258 * 3259 * Details: http://www.netlib.org/lapack/explore-html/d6/d5b/cgemm_8f.html 3260 * 3261 * @param TransA The type of transpose applied to matrix A. 3262 * @param TransB The type of transpose applied to matrix B. 3263 * @param alpha The scalar alpha. 3264 * @param A The input allocation contains matrix A, supported elements type: {Element#F32_2}. 3265 * @param B The input allocation contains matrix B, supported elements type: {Element#F32_2}. 3266 * @param beta The scalar beta. 3267 * @param C The input allocation contains matrix C, supported elements type: {Element#F32_2}. 3268 */ 3269 void CGEMM(RsBlasTranspose TransA, RsBlasTranspose TransB, Float2 alpha, const sp<Allocation>& A, 3270 const sp<Allocation>& B, Float2 beta, const sp<Allocation>& C); 3271 3272 /** 3273 * ZGEMM performs one of the matrix-matrix operations 3274 * C := alpha*op(A)*op(B) + beta*C where op(X) is one of op(X) = X or op(X) = X**T or op(X) = X**H 3275 * 3276 * Details: http://www.netlib.org/lapack/explore-html/d7/d76/zgemm_8f.html 3277 * 3278 * @param TransA The type of transpose applied to matrix A. 3279 * @param TransB The type of transpose applied to matrix B. 3280 * @param alpha The scalar alpha. 3281 * @param A The input allocation contains matrix A, supported elements type: {Element#F64_2}. 3282 * @param B The input allocation contains matrix B, supported elements type: {Element#F64_2}. 3283 * @param beta The scalar beta. 3284 * @param C The input allocation contains matrix C, supported elements type: {Element#F64_2}. 3285 */ 3286 void ZGEMM(RsBlasTranspose TransA, RsBlasTranspose TransB, Double2 alpha, const sp<Allocation>& A, 3287 const sp<Allocation>& B, Double2 beta, const sp<Allocation>& C); 3288 3289 /** 3290 * SSYMM performs one of the matrix-matrix operations 3291 * C := alpha*A*B + beta*C or C := alpha*B*A + beta*C 3292 * 3293 * Details: http://www.netlib.org/lapack/explore-html/d7/d42/ssymm_8f.html 3294 * 3295 * @param Side Specifies whether the symmetric matrix A appears on the left or right. 3296 * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. 3297 * @param alpha The scalar alpha. 3298 * @param A The input allocation contains matrix A, supported elements type: {Element#F32}. 3299 * @param B The input allocation contains matrix B, supported elements type: {Element#F32}. 3300 * @param beta The scalar beta. 3301 * @param C The input allocation contains matrix C, supported elements type: {Element#F32}. 3302 */ 3303 void SSYMM(RsBlasSide Side, RsBlasUplo Uplo, float alpha, const sp<Allocation>& A, 3304 const sp<Allocation>& B, float beta, const sp<Allocation>& C); 3305 3306 /** 3307 * DSYMM performs one of the matrix-matrix operations 3308 * C := alpha*A*B + beta*C or C := alpha*B*A + beta*C 3309 * 3310 * Details: http://www.netlib.org/lapack/explore-html/d8/db0/dsymm_8f.html 3311 * 3312 * @param Side Specifies whether the symmetric matrix A appears on the left or right. 3313 * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. 3314 * @param alpha The scalar alpha. 3315 * @param A The input allocation contains matrix A, supported elements type: {Element#F64}. 3316 * @param B The input allocation contains matrix B, supported elements type: {Element#F64}. 3317 * @param beta The scalar beta. 3318 * @param C The input allocation contains matrix C, supported elements type: {Element#F64}. 3319 */ 3320 void DSYMM(RsBlasSide Side, RsBlasUplo Uplo, double alpha, const sp<Allocation>& A, 3321 const sp<Allocation>& B, double beta, const sp<Allocation>& C); 3322 3323 /** 3324 * CSYMM performs one of the matrix-matrix operations 3325 * C := alpha*A*B + beta*C or C := alpha*B*A + beta*C 3326 * 3327 * Details: http://www.netlib.org/lapack/explore-html/db/d59/csymm_8f.html 3328 * 3329 * @param Side Specifies whether the symmetric matrix A appears on the left or right. 3330 * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. 3331 * @param alpha The scalar alpha. 3332 * @param A The input allocation contains matrix A, supported elements type: {Element#F32_2}. 3333 * @param B The input allocation contains matrix B, supported elements type: {Element#F32_2}. 3334 * @param beta The scalar beta. 3335 * @param C The input allocation contains matrix C, supported elements type: {Element#F32_2}. 3336 */ 3337 void CSYMM(RsBlasSide Side, RsBlasUplo Uplo, Float2 alpha, const sp<Allocation>& A, 3338 const sp<Allocation>& B, Float2 beta, const sp<Allocation>& C); 3339 3340 /** 3341 * ZSYMM performs one of the matrix-matrix operations 3342 * C := alpha*A*B + beta*C or C := alpha*B*A + beta*C 3343 * 3344 * Details: http://www.netlib.org/lapack/explore-html/df/d51/zsymm_8f.html 3345 * 3346 * @param Side Specifies whether the symmetric matrix A appears on the left or right. 3347 * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. 3348 * @param alpha The scalar alpha. 3349 * @param A The input allocation contains matrix A, supported elements type: {Element#F64_2}. 3350 * @param B The input allocation contains matrix B, supported elements type: {Element#F64_2}. 3351 * @param beta The scalar beta. 3352 * @param C The input allocation contains matrix C, supported elements type: {Element#F64_2}. 3353 */ 3354 void ZSYMM(RsBlasSide Side, RsBlasUplo Uplo, Double2 alpha, const sp<Allocation>& A, 3355 const sp<Allocation>& B, Double2 beta, const sp<Allocation>& C); 3356 3357 /** 3358 * SSYRK performs one of the symmetric rank k operations 3359 * C := alpha*A*A**T + beta*C or C := alpha*A**T*A + beta*C 3360 * 3361 * Details: http://www.netlib.org/lapack/explore-html/d0/d40/ssyrk_8f.html 3362 * 3363 * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced. 3364 * @param Trans The type of transpose applied to the operation. 3365 * @param alpha The scalar alpha. 3366 * @param A The input allocation contains matrix A, supported elements type: {Element#F32}. 3367 * @param beta The scalar beta. 3368 * @param C The input allocation contains matrix C, supported elements type: {Element#F32}. 3369 */ 3370 void SSYRK(RsBlasUplo Uplo, RsBlasTranspose Trans, float alpha, 3371 const sp<Allocation>& A, float beta, const sp<Allocation>& C); 3372 3373 /** 3374 * DSYRK performs one of the symmetric rank k operations 3375 * C := alpha*A*A**T + beta*C or C := alpha*A**T*A + beta*C 3376 * 3377 * Details: http://www.netlib.org/lapack/explore-html/dc/d05/dsyrk_8f.html 3378 * 3379 * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced. 3380 * @param Trans The type of transpose applied to the operation. 3381 * @param alpha The scalar alpha. 3382 * @param A The input allocation contains matrix A, supported elements type: {Element#F64}. 3383 * @param beta The scalar beta. 3384 * @param C The input allocation contains matrix C, supported elements type: {Element#F64}. 3385 */ 3386 void DSYRK(RsBlasUplo Uplo, RsBlasTranspose Trans, double alpha, 3387 const sp<Allocation>& A, double beta, const sp<Allocation>& C); 3388 3389 /** 3390 * CSYRK performs one of the symmetric rank k operations 3391 * C := alpha*A*A**T + beta*C or C := alpha*A**T*A + beta*C 3392 * 3393 * Details: http://www.netlib.org/lapack/explore-html/d3/d6a/csyrk_8f.html 3394 * 3395 * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced. 3396 * @param Trans The type of transpose applied to the operation. 3397 * @param alpha The scalar alpha. 3398 * @param A The input allocation contains matrix A, supported elements type: {Element#F32_2}. 3399 * @param beta The scalar beta. 3400 * @param C The input allocation contains matrix C, supported elements type: {Element#F32_2}. 3401 */ 3402 void CSYRK(RsBlasUplo Uplo, RsBlasTranspose Trans, Float2 alpha, 3403 const sp<Allocation>& A, Float2 beta, const sp<Allocation>& C); 3404 3405 /** 3406 * ZSYRK performs one of the symmetric rank k operations 3407 * C := alpha*A*A**T + beta*C or C := alpha*A**T*A + beta*C 3408 * 3409 * Details: http://www.netlib.org/lapack/explore-html/de/d54/zsyrk_8f.html 3410 * 3411 * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced. 3412 * @param Trans The type of transpose applied to the operation. 3413 * @param alpha The scalar alpha. 3414 * @param A The input allocation contains matrix A, supported elements type: {Element#F64_2}. 3415 * @param beta The scalar beta. 3416 * @param C The input allocation contains matrix C, supported elements type: {Element#F64_2}. 3417 */ 3418 void ZSYRK(RsBlasUplo Uplo, RsBlasTranspose Trans, Double2 alpha, 3419 const sp<Allocation>& A, Double2 beta, const sp<Allocation>& C); 3420 3421 /** 3422 * SSYR2K performs one of the symmetric rank 2k operations 3423 * C := alpha*A*B**T + alpha*B*A**T + beta*C or C := alpha*A**T*B + alpha*B**T*A + beta*C 3424 * 3425 * Details: http://www.netlib.org/lapack/explore-html/df/d3d/ssyr2k_8f.html 3426 * 3427 * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced. 3428 * @param Trans The type of transpose applied to the operation. 3429 * @param alpha The scalar alpha. 3430 * @param A The input allocation contains matrix A, supported elements type: {Element#F32}. 3431 * @param B The input allocation contains matrix B, supported elements type: {Element#F32}. 3432 * @param beta The scalar beta. 3433 * @param C The input allocation contains matrix C, supported elements type: {Element#F32}. 3434 */ 3435 void SSYR2K(RsBlasUplo Uplo, RsBlasTranspose Trans, float alpha, 3436 const sp<Allocation>& A, const sp<Allocation>& B, float beta, const sp<Allocation>& C); 3437 3438 /** 3439 * DSYR2K performs one of the symmetric rank 2k operations 3440 * C := alpha*A*B**T + alpha*B*A**T + beta*C or C := alpha*A**T*B + alpha*B**T*A + beta*C 3441 * 3442 * Details: http://www.netlib.org/lapack/explore-html/d1/dec/dsyr2k_8f.html 3443 * 3444 * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced. 3445 * @param Trans The type of transpose applied to the operation. 3446 * @param alpha The scalar alpha. 3447 * @param A The input allocation contains matrix A, supported elements type: {Element#F64}. 3448 * @param B The input allocation contains matrix B, supported elements type: {Element#F64}. 3449 * @param beta The scalar beta. 3450 * @param C The input allocation contains matrix C, supported elements type: {Element#F64}. 3451 */ 3452 void DSYR2K(RsBlasUplo Uplo, RsBlasTranspose Trans, double alpha, 3453 const sp<Allocation>& A, const sp<Allocation>& B, double beta, const sp<Allocation>& C); 3454 3455 /** 3456 * CSYR2K performs one of the symmetric rank 2k operations 3457 * C := alpha*A*B**T + alpha*B*A**T + beta*C or C := alpha*A**T*B + alpha*B**T*A + beta*C 3458 * 3459 * Details: http://www.netlib.org/lapack/explore-html/de/d7e/csyr2k_8f.html 3460 * 3461 * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced. 3462 * @param Trans The type of transpose applied to the operation. 3463 * @param alpha The scalar alpha. 3464 * @param A The input allocation contains matrix A, supported elements type: {Element#F32_2}. 3465 * @param B The input allocation contains matrix B, supported elements type: {Element#F32_2}. 3466 * @param beta The scalar beta. 3467 * @param C The input allocation contains matrix C, supported elements type: {Element#F32_2}. 3468 */ 3469 void CSYR2K(RsBlasUplo Uplo, RsBlasTranspose Trans, Float2 alpha, 3470 const sp<Allocation>& A, const sp<Allocation>& B, Float2 beta, const sp<Allocation>& C); 3471 3472 /** 3473 * ZSYR2K performs one of the symmetric rank 2k operations 3474 * C := alpha*A*B**T + alpha*B*A**T + beta*C or C := alpha*A**T*B + alpha*B**T*A + beta*C 3475 * 3476 * Details: http://www.netlib.org/lapack/explore-html/df/d20/zsyr2k_8f.html 3477 * 3478 * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced. 3479 * @param Trans The type of transpose applied to the operation. 3480 * @param alpha The scalar alpha. 3481 * @param A The input allocation contains matrix A, supported elements type: {Element#F64_2}. 3482 * @param B The input allocation contains matrix B, supported elements type: {Element#F64_2}. 3483 * @param beta The scalar beta. 3484 * @param C The input allocation contains matrix C, supported elements type: {Element#F64_2}. 3485 */ 3486 void ZSYR2K(RsBlasUplo Uplo, RsBlasTranspose Trans, Double2 alpha, 3487 const sp<Allocation>& A, const sp<Allocation>& B, Double2 beta, const sp<Allocation>& C); 3488 3489 /** 3490 * STRMM performs one of the matrix-matrix operations 3491 * B := alpha*op(A)*B or B := alpha*B*op(A) 3492 * op(A) is one of op(A) = A or op(A) = A**T 3493 * 3494 * Details: http://www.netlib.org/lapack/explore-html/df/d01/strmm_8f.html 3495 * 3496 * @param Side Specifies whether the symmetric matrix A appears on the left or right. 3497 * @param Uplo Specifies whether matrix A is upper or lower triangular. 3498 * @param TransA The type of transpose applied to matrix A. 3499 * @param Diag Specifies whether or not A is unit triangular. 3500 * @param alpha The scalar alpha. 3501 * @param A The input allocation contains matrix A, supported elements type: {Element#F32}. 3502 * @param B The input allocation contains matrix B, supported elements type: {Element#F32}. 3503 */ 3504 void STRMM(RsBlasSide Side, RsBlasUplo Uplo, RsBlasTranspose TransA, 3505 RsBlasDiag Diag, float alpha, const sp<Allocation>& A, const sp<Allocation>& B); 3506 3507 /** 3508 * DTRMM performs one of the matrix-matrix operations 3509 * B := alpha*op(A)*B or B := alpha*B*op(A) 3510 * op(A) is one of op(A) = A or op(A) = A**T 3511 * 3512 * Details: http://www.netlib.org/lapack/explore-html/dd/d19/dtrmm_8f.html 3513 * 3514 * @param Side Specifies whether the symmetric matrix A appears on the left or right. 3515 * @param Uplo Specifies whether matrix A is upper or lower triangular. 3516 * @param TransA The type of transpose applied to matrix A. 3517 * @param Diag Specifies whether or not A is unit triangular. 3518 * @param alpha The scalar alpha. 3519 * @param A The input allocation contains matrix A, supported elements type: {Element#F64}. 3520 * @param B The input allocation contains matrix B, supported elements type: {Element#F64}. 3521 */ 3522 void DTRMM(RsBlasSide Side, RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 3523 double alpha, const sp<Allocation>& A, const sp<Allocation>& B); 3524 3525 /** 3526 * CTRMM performs one of the matrix-matrix operations 3527 * B := alpha*op(A)*B or B := alpha*B*op(A) 3528 * op(A) is one of op(A) = A or op(A) = A**T or op(A) = A**H 3529 * 3530 * Details: http://www.netlib.org/lapack/explore-html/d4/d9b/ctrmm_8f.html 3531 * 3532 * @param Side Specifies whether the symmetric matrix A appears on the left or right. 3533 * @param Uplo Specifies whether matrix A is upper or lower triangular. 3534 * @param TransA The type of transpose applied to matrix A. 3535 * @param Diag Specifies whether or not A is unit triangular. 3536 * @param alpha The scalar alpha. 3537 * @param A The input allocation contains matrix A, supported elements type: {Element#F32_2}. 3538 * @param B The input allocation contains matrix B, supported elements type: {Element#F32_2}. 3539 */ 3540 void CTRMM(RsBlasSide Side, RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 3541 Float2 alpha, const sp<Allocation>& A, const sp<Allocation>& B); 3542 3543 /** 3544 * ZTRMM performs one of the matrix-matrix operations 3545 * B := alpha*op(A)*B or B := alpha*B*op(A) 3546 * op(A) is one of op(A) = A or op(A) = A**T or op(A) = A**H 3547 * 3548 * Details: http://www.netlib.org/lapack/explore-html/d8/de1/ztrmm_8f.html 3549 * 3550 * @param Side Specifies whether the symmetric matrix A appears on the left or right. 3551 * @param Uplo Specifies whether matrix A is upper or lower triangular. 3552 * @param TransA The type of transpose applied to matrix A. 3553 * @param Diag Specifies whether or not A is unit triangular. 3554 * @param alpha The scalar alpha. 3555 * @param A The input allocation contains matrix A, supported elements type: {Element#F64_2}. 3556 * @param B The input allocation contains matrix B, supported elements type: {Element#F64_2}. 3557 */ 3558 void ZTRMM(RsBlasSide Side, RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 3559 Double2 alpha, const sp<Allocation>& A, const sp<Allocation>& B); 3560 3561 /** 3562 * STRSM solves one of the matrix equations 3563 * op(A)*X := alpha*B or X*op(A) := alpha*B 3564 * op(A) is one of op(A) = A or op(A) = A**T 3565 * 3566 * Details: http://www.netlib.org/lapack/explore-html/d2/d8b/strsm_8f.html 3567 * 3568 * @param Side Specifies whether the symmetric matrix A appears on the left or right. 3569 * @param Uplo Specifies whether matrix A is upper or lower triangular. 3570 * @param TransA The type of transpose applied to matrix A. 3571 * @param Diag Specifies whether or not A is unit triangular. 3572 * @param alpha The scalar alpha. 3573 * @param A The input allocation contains matrix A, supported elements type: {Element#F32}. 3574 * @param B The input allocation contains matrix B, supported elements type: {Element#F32}. 3575 */ 3576 void STRSM(RsBlasSide Side, RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 3577 float alpha, const sp<Allocation>& A, const sp<Allocation>& B); 3578 3579 /** 3580 * DTRSM solves one of the matrix equations 3581 * op(A)*X := alpha*B or X*op(A) := alpha*B 3582 * op(A) is one of op(A) = A or op(A) = A**T 3583 * 3584 * Details: http://www.netlib.org/lapack/explore-html/de/da7/dtrsm_8f.html 3585 * 3586 * @param Side Specifies whether the symmetric matrix A appears on the left or right. 3587 * @param Uplo Specifies whether matrix A is upper or lower triangular. 3588 * @param TransA The type of transpose applied to matrix A. 3589 * @param Diag Specifies whether or not A is unit triangular. 3590 * @param alpha The scalar alpha. 3591 * @param A The input allocation contains matrix A, supported elements type: {Element#F64}. 3592 * @param B The input allocation contains matrix B, supported elements type: {Element#F64}. 3593 */ 3594 void DTRSM(RsBlasSide Side, RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 3595 double alpha, const sp<Allocation>& A, const sp<Allocation>& B); 3596 3597 /** 3598 * CTRSM solves one of the matrix equations 3599 * op(A)*X := alpha*B or X*op(A) := alpha*B 3600 * op(A) is one of op(A) = A or op(A) = A**T or op(A) = A**H 3601 * 3602 * Details: http://www.netlib.org/lapack/explore-html/de/d30/ctrsm_8f.html 3603 * 3604 * @param Side Specifies whether the symmetric matrix A appears on the left or right. 3605 * @param Uplo Specifies whether matrix A is upper or lower triangular. 3606 * @param TransA The type of transpose applied to matrix A. 3607 * @param Diag Specifies whether or not A is unit triangular. 3608 * @param alpha The scalar alpha. 3609 * @param A The input allocation contains matrix A, supported elements type: {Element#F32_2}. 3610 * @param B The input allocation contains matrix B, supported elements type: {Element#F32_2}. 3611 */ 3612 void CTRSM(RsBlasSide Side, RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 3613 Float2 alpha, const sp<Allocation>& A, const sp<Allocation>& B); 3614 3615 /** 3616 * ZTRSM solves one of the matrix equations 3617 * op(A)*X := alpha*B or X*op(A) := alpha*B 3618 * op(A) is one of op(A) = A or op(A) = A**T or op(A) = A**H 3619 * 3620 * Details: http://www.netlib.org/lapack/explore-html/d1/d39/ztrsm_8f.html 3621 * 3622 * @param Side Specifies whether the symmetric matrix A appears on the left or right. 3623 * @param Uplo Specifies whether matrix A is upper or lower triangular. 3624 * @param TransA The type of transpose applied to matrix A. 3625 * @param Diag Specifies whether or not A is unit triangular. 3626 * @param alpha The scalar alpha. 3627 * @param A The input allocation contains matrix A, supported elements type: {Element#F64_2}. 3628 * @param B The input allocation contains matrix B, supported elements type: {Element#F64_2}. 3629 */ 3630 void ZTRSM(RsBlasSide Side, RsBlasUplo Uplo, RsBlasTranspose TransA, RsBlasDiag Diag, 3631 Double2 alpha, const sp<Allocation>& A, const sp<Allocation>& B); 3632 3633 /** 3634 * CHEMM performs one of the matrix-matrix operations 3635 * C := alpha*A*B + beta*C or C := alpha*B*A + beta*C 3636 * 3637 * Details: http://www.netlib.org/lapack/explore-html/d3/d66/chemm_8f.html 3638 * 3639 * @param Side Specifies whether the symmetric matrix A appears on the left or right. 3640 * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. 3641 * @param alpha The scalar alpha. 3642 * @param A The input allocation contains matrix A, supported elements type: {Element#F32_2}. 3643 * @param B The input allocation contains matrix B, supported elements type: {Element#F32_2}. 3644 * @param beta The scalar beta. 3645 * @param C The input allocation contains matrix C, supported elements type: {Element#F32_2}. 3646 */ 3647 void CHEMM(RsBlasSide Side, RsBlasUplo Uplo, Float2 alpha, const sp<Allocation>& A, 3648 const sp<Allocation>& B, Float2 beta, const sp<Allocation>& C); 3649 3650 /** 3651 * ZHEMM performs one of the matrix-matrix operations 3652 * C := alpha*A*B + beta*C or C := alpha*B*A + beta*C 3653 * 3654 * Details: http://www.netlib.org/lapack/explore-html/d6/d3e/zhemm_8f.html 3655 * 3656 * @param Side Specifies whether the symmetric matrix A appears on the left or right. 3657 * @param Uplo Specifies whether the upper or lower triangular part is to be referenced. 3658 * @param alpha The scalar alpha. 3659 * @param A The input allocation contains matrix A, supported elements type: {Element#F64_2}. 3660 * @param B The input allocation contains matrix B, supported elements type: {Element#F64_2}. 3661 * @param beta The scalar beta. 3662 * @param C The input allocation contains matrix C, supported elements type: {Element#F64_2}. 3663 */ 3664 void ZHEMM(RsBlasSide Side, RsBlasUplo Uplo, Double2 alpha, const sp<Allocation>& A, 3665 const sp<Allocation>& B, Double2 beta, const sp<Allocation>& C); 3666 3667 /** 3668 * CHERK performs one of the hermitian rank k operations 3669 * C := alpha*A*A**H + beta*C or C := alpha*A**H*A + beta*C 3670 * 3671 * Details: http://www.netlib.org/lapack/explore-html/d8/d52/cherk_8f.html 3672 * 3673 * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced. 3674 * @param Trans The type of transpose applied to the operation. 3675 * @param alpha The scalar alpha. 3676 * @param A The input allocation contains matrix A, supported elements type: {Element#F32_2}. 3677 * @param beta The scalar beta. 3678 * @param C The input allocation contains matrix C, supported elements type: {Element#F32_2}. 3679 */ 3680 void CHERK(RsBlasUplo Uplo, RsBlasTranspose Trans, float alpha, const sp<Allocation>& A, 3681 float beta, const sp<Allocation>& C); 3682 3683 /** 3684 * ZHERK performs one of the hermitian rank k operations 3685 * C := alpha*A*A**H + beta*C or C := alpha*A**H*A + beta*C 3686 * 3687 * Details: http://www.netlib.org/lapack/explore-html/d1/db1/zherk_8f.html 3688 * 3689 * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced. 3690 * @param Trans The type of transpose applied to the operation. 3691 * @param alpha The scalar alpha. 3692 * @param A The input allocation contains matrix A, supported elements type: {Element#F64_2}. 3693 * @param beta The scalar beta. 3694 * @param C The input allocation contains matrix C, supported elements type: {Element#F64_2}. 3695 */ 3696 void ZHERK(RsBlasUplo Uplo, RsBlasTranspose Trans, double alpha, const sp<Allocation>& A, 3697 double beta, const sp<Allocation>& C); 3698 3699 /** 3700 * CHER2K performs one of the hermitian rank 2k operations 3701 * C := alpha*A*B**H + conjg( alpha )*B*A**H + beta*C or C := alpha*A**H*B + conjg( alpha )*B**H*A + beta*C 3702 * 3703 * Details: http://www.netlib.org/lapack/explore-html/d1/d82/cher2k_8f.html 3704 * 3705 * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced. 3706 * @param Trans The type of transpose applied to the operation. 3707 * @param alpha The scalar alpha. 3708 * @param A The input allocation contains matrix A, supported elements type: {Element#F32_2}. 3709 * @param B The input allocation contains matrix B, supported elements type: {Element#F32_2}. 3710 * @param beta The scalar beta. 3711 * @param C The input allocation contains matrix C, supported elements type: {Element#F32_2}. 3712 */ 3713 void CHER2K(RsBlasUplo Uplo, RsBlasTranspose Trans, Float2 alpha, const sp<Allocation>& A, 3714 const sp<Allocation>& B, float beta, const sp<Allocation>& C); 3715 3716 /** 3717 * ZHER2K performs one of the hermitian rank 2k operations 3718 * C := alpha*A*B**H + conjg( alpha )*B*A**H + beta*C or C := alpha*A**H*B + conjg( alpha )*B**H*A + beta*C 3719 * 3720 * Details: http://www.netlib.org/lapack/explore-html/d7/dfa/zher2k_8f.html 3721 * 3722 * @param Uplo Specifies whether the upper or lower triangular part of C is to be referenced. 3723 * @param Trans The type of transpose applied to the operation. 3724 * @param alpha The scalar alpha. 3725 * @param A The input allocation contains matrix A, supported elements type: {Element#F64_2}. 3726 * @param B The input allocation contains matrix B, supported elements type: {Element#F64_2}. 3727 * @param beta The scalar beta. 3728 * @param C The input allocation contains matrix C, supported elements type: {Element#F64_2}. 3729 */ 3730 void ZHER2K(RsBlasUplo Uplo, RsBlasTranspose Trans, Double2 alpha, const sp<Allocation>& A, 3731 const sp<Allocation>& B, double beta, const sp<Allocation>& C); 3732 3733 /** 3734 * 8-bit GEMM-like operation for neural networks: C = A * Transpose(B) 3735 * Calculations are done in 1.10.21 fixed-point format for the final output, 3736 * just before there's a shift down to drop the fractional parts. The output 3737 * values are gated to 0 to 255 to fit in a byte, but the 10-bit format 3738 * gives some headroom to avoid wrapping around on small overflows. 3739 * 3740 * @param A The input allocation contains matrix A, supported elements type: {Element#U8}. 3741 * @param a_offset The offset for all values in matrix A, e.g A[i,j] = A[i,j] - a_offset. Value should be from 0 to 255. 3742 * @param B The input allocation contains matrix B, supported elements type: {Element#U8}. 3743 * @param b_offset The offset for all values in matrix B, e.g B[i,j] = B[i,j] - b_offset. Value should be from 0 to 255. 3744 * @param C The input allocation contains matrix C, supported elements type: {Element#U8}. 3745 * @param c_offset The offset for all values in matrix C. 3746 * @param c_mult The multiplier for all values in matrix C, e.g C[i,j] = (C[i,j] + c_offset) * c_mult. 3747 **/ 3748 void BNNM(const sp<Allocation>& A, int a_offset, const sp<Allocation>& B, int b_offset, const sp<Allocation>& C, 3749 int c_offset, int c_mult); 3750 }; 3751 3752 /** 3753 * Intrinsic kernel for blending two Allocations. 3754 */ 3755 class ScriptIntrinsicBlend : public ScriptIntrinsic { 3756 private: 3757 ScriptIntrinsicBlend(sp<RS> rs, sp<const Element> e); 3758 public: 3759 /** 3760 * Supported Element types are U8_4. 3761 * @param[in] rs RenderScript context 3762 * @param[in] e Element 3763 * @return new ScriptIntrinsicBlend 3764 */ 3765 static sp<ScriptIntrinsicBlend> create(const sp<RS>& rs, const sp<const Element>& e); 3766 /** 3767 * sets dst = {0, 0, 0, 0} 3768 * @param[in] in input Allocation 3769 * @param[in] out output Allocation 3770 */ 3771 void forEachClear(const sp<Allocation>& in, const sp<Allocation>& out); 3772 /** 3773 * Sets dst = src 3774 * @param[in] in input Allocation 3775 * @param[in] out output Allocation 3776 */ 3777 void forEachSrc(const sp<Allocation>& in, const sp<Allocation>& out); 3778 /** 3779 * Sets dst = dst (NOP) 3780 * @param[in] in input Allocation 3781 * @param[in] out output Allocation 3782 */ 3783 void forEachDst(const sp<Allocation>& in, const sp<Allocation>& out); 3784 /** 3785 * Sets dst = src + dst * (1.0 - src.a) 3786 * @param[in] in input Allocation 3787 * @param[in] out output Allocation 3788 */ 3789 void forEachSrcOver(const sp<Allocation>& in, const sp<Allocation>& out); 3790 /** 3791 * Sets dst = dst + src * (1.0 - dst.a) 3792 * @param[in] in input Allocation 3793 * @param[in] out output Allocation 3794 */ 3795 void forEachDstOver(const sp<Allocation>& in, const sp<Allocation>& out); 3796 /** 3797 * Sets dst = src * dst.a 3798 * @param[in] in input Allocation 3799 * @param[in] out output Allocation 3800 */ 3801 void forEachSrcIn(const sp<Allocation>& in, const sp<Allocation>& out); 3802 /** 3803 * Sets dst = dst * src.a 3804 * @param[in] in input Allocation 3805 * @param[in] out output Allocation 3806 */ 3807 void forEachDstIn(const sp<Allocation>& in, const sp<Allocation>& out); 3808 /** 3809 * Sets dst = src * (1.0 - dst.a) 3810 * @param[in] in input Allocation 3811 * @param[in] out output Allocation 3812 */ 3813 void forEachSrcOut(const sp<Allocation>& in, const sp<Allocation>& out); 3814 /** 3815 * Sets dst = dst * (1.0 - src.a) 3816 * @param[in] in input Allocation 3817 * @param[in] out output Allocation 3818 */ 3819 void forEachDstOut(const sp<Allocation>& in, const sp<Allocation>& out); 3820 /** 3821 * Sets dst.rgb = src.rgb * dst.a + (1.0 - src.a) * dst.rgb 3822 * @param[in] in input Allocation 3823 * @param[in] out output Allocation 3824 */ 3825 void forEachSrcAtop(const sp<Allocation>& in, const sp<Allocation>& out); 3826 /** 3827 * Sets dst.rgb = dst.rgb * src.a + (1.0 - dst.a) * src.rgb 3828 * @param[in] in input Allocation 3829 * @param[in] out output Allocation 3830 */ 3831 void forEachDstAtop(const sp<Allocation>& in, const sp<Allocation>& out); 3832 /** 3833 * Sets dst = {src.r ^ dst.r, src.g ^ dst.g, src.b ^ dst.b, src.a ^ dst.a} 3834 * @param[in] in input Allocation 3835 * @param[in] out output Allocation 3836 */ 3837 void forEachXor(const sp<Allocation>& in, const sp<Allocation>& out); 3838 /** 3839 * Sets dst = src * dst 3840 * @param[in] in input Allocation 3841 * @param[in] out output Allocation 3842 */ 3843 void forEachMultiply(const sp<Allocation>& in, const sp<Allocation>& out); 3844 /** 3845 * Sets dst = min(src + dst, 1.0) 3846 * @param[in] in input Allocation 3847 * @param[in] out output Allocation 3848 */ 3849 void forEachAdd(const sp<Allocation>& in, const sp<Allocation>& out); 3850 /** 3851 * Sets dst = max(dst - src, 0.0) 3852 * @param[in] in input Allocation 3853 * @param[in] out output Allocation 3854 */ 3855 void forEachSubtract(const sp<Allocation>& in, const sp<Allocation>& out); 3856 }; 3857 3858 /** 3859 * Intrinsic Gausian blur filter. Applies a Gaussian blur of the specified 3860 * radius to all elements of an Allocation. 3861 */ 3862 class ScriptIntrinsicBlur : public ScriptIntrinsic { 3863 private: 3864 ScriptIntrinsicBlur(sp<RS> rs, sp<const Element> e); 3865 public: 3866 /** 3867 * Supported Element types are U8 and U8_4. 3868 * @param[in] rs RenderScript context 3869 * @param[in] e Element 3870 * @return new ScriptIntrinsicBlur 3871 */ 3872 static sp<ScriptIntrinsicBlur> create(const sp<RS>& rs, const sp<const Element>& e); 3873 /** 3874 * Sets the input of the blur. 3875 * @param[in] in input Allocation 3876 */ 3877 void setInput(const sp<Allocation>& in); 3878 /** 3879 * Runs the intrinsic. 3880 * @param[in] output Allocation 3881 */ 3882 void forEach(const sp<Allocation>& out); 3883 /** 3884 * Sets the radius of the blur. The supported range is 0 < radius <= 25. 3885 * @param[in] radius radius of the blur 3886 */ 3887 void setRadius(float radius); 3888 }; 3889 3890 /** 3891 * Intrinsic for applying a color matrix to allocations. This has the 3892 * same effect as loading each element and converting it to a 3893 * F32_N, multiplying the result by the 4x4 color matrix 3894 * as performed by rsMatrixMultiply() and writing it to the output 3895 * after conversion back to U8_N or F32_N. 3896 */ 3897 class ScriptIntrinsicColorMatrix : public ScriptIntrinsic { 3898 private: 3899 ScriptIntrinsicColorMatrix(sp<RS> rs, sp<const Element> e); 3900 public: 3901 /** 3902 * Creates a new intrinsic. 3903 * @param[in] rs RenderScript context 3904 * @return new ScriptIntrinsicColorMatrix 3905 */ 3906 static sp<ScriptIntrinsicColorMatrix> create(const sp<RS>& rs); 3907 /** 3908 * Applies the color matrix. Supported types are U8 and F32 with 3909 * vector lengths between 1 and 4. 3910 * @param[in] in input Allocation 3911 * @param[out] out output Allocation 3912 */ 3913 void forEach(const sp<Allocation>& in, const sp<Allocation>& out); 3914 /** 3915 * Set the value to be added after the color matrix has been 3916 * applied. The default value is {0, 0, 0, 0}. 3917 * @param[in] add float[4] of values 3918 */ 3919 void setAdd(float* add); 3920 3921 /** 3922 * Set the color matrix which will be applied to each cell of the 3923 * image. The alpha channel will be copied. 3924 * 3925 * @param[in] m float[9] of values 3926 */ 3927 void setColorMatrix3(float* m); 3928 /** 3929 * Set the color matrix which will be applied to each cell of the 3930 * image. 3931 * 3932 * @param[in] m float[16] of values 3933 */ 3934 void setColorMatrix4(float* m); 3935 /** 3936 * Set a color matrix to convert from RGB to luminance. The alpha 3937 * channel will be a copy. 3938 */ 3939 void setGreyscale(); 3940 /** 3941 * Set the matrix to convert from RGB to YUV with a direct copy of 3942 * the 4th channel. 3943 */ 3944 void setRGBtoYUV(); 3945 /** 3946 * Set the matrix to convert from YUV to RGB with a direct copy of 3947 * the 4th channel. 3948 */ 3949 void setYUVtoRGB(); 3950 }; 3951 3952 /** 3953 * Intrinsic for applying a 3x3 convolve to an allocation. 3954 */ 3955 class ScriptIntrinsicConvolve3x3 : public ScriptIntrinsic { 3956 private: 3957 ScriptIntrinsicConvolve3x3(sp<RS> rs, sp<const Element> e); 3958 public: 3959 /** 3960 * Supported types U8 and F32 with vector lengths between 1 and 3961 * 4. The default convolution kernel is the identity. 3962 * @param[in] rs RenderScript context 3963 * @param[in] e Element 3964 * @return new ScriptIntrinsicConvolve3x3 3965 */ 3966 static sp<ScriptIntrinsicConvolve3x3> create(const sp<RS>& rs, const sp<const Element>& e); 3967 /** 3968 * Sets input for intrinsic. 3969 * @param[in] in input Allocation 3970 */ 3971 void setInput(const sp<Allocation>& in); 3972 /** 3973 * Launches the intrinsic. 3974 * @param[in] out output Allocation 3975 */ 3976 void forEach(const sp<Allocation>& out); 3977 /** 3978 * Sets convolution kernel. 3979 * @param[in] v float[9] of values 3980 */ 3981 void setCoefficients(float* v); 3982 }; 3983 3984 /** 3985 * Intrinsic for applying a 5x5 convolve to an allocation. 3986 */ 3987 class ScriptIntrinsicConvolve5x5 : public ScriptIntrinsic { 3988 private: 3989 ScriptIntrinsicConvolve5x5(sp<RS> rs, sp<const Element> e); 3990 public: 3991 /** 3992 * Supported types U8 and F32 with vector lengths between 1 and 3993 * 4. The default convolution kernel is the identity. 3994 * @param[in] rs RenderScript context 3995 * @param[in] e Element 3996 * @return new ScriptIntrinsicConvolve5x5 3997 */ 3998 static sp<ScriptIntrinsicConvolve5x5> create(const sp<RS>& rs, const sp<const Element>& e); 3999 /** 4000 * Sets input for intrinsic. 4001 * @param[in] in input Allocation 4002 */ 4003 void setInput(const sp<Allocation>& in); 4004 /** 4005 * Launches the intrinsic. 4006 * @param[in] out output Allocation 4007 */ 4008 void forEach(const sp<Allocation>& out); 4009 /** 4010 * Sets convolution kernel. 4011 * @param[in] v float[25] of values 4012 */ 4013 void setCoefficients(float* v); 4014 }; 4015 4016 /** 4017 * Intrinsic for computing a histogram. 4018 */ 4019 class ScriptIntrinsicHistogram : public ScriptIntrinsic { 4020 private: 4021 ScriptIntrinsicHistogram(sp<RS> rs, sp<const Element> e); 4022 sp<Allocation> mOut; 4023 public: 4024 /** 4025 * Create an intrinsic for calculating the histogram of an uchar 4026 * or uchar4 image. 4027 * 4028 * Supported elements types are U8_4, U8_3, U8_2, and U8. 4029 * 4030 * @param[in] rs The RenderScript context 4031 * @param[in] e Element type for inputs 4032 * 4033 * @return ScriptIntrinsicHistogram 4034 */ 4035 static sp<ScriptIntrinsicHistogram> create(const sp<RS>& rs, const sp<const Element>& e); 4036 /** 4037 * Set the output of the histogram. 32 bit integer types are 4038 * supported. 4039 * 4040 * @param[in] aout The output allocation 4041 */ 4042 void setOutput(const sp<Allocation>& aout); 4043 /** 4044 * Set the coefficients used for the dot product calculation. The 4045 * default is {0.299f, 0.587f, 0.114f, 0.f}. 4046 * 4047 * Coefficients must be >= 0 and sum to 1.0 or less. 4048 * 4049 * @param[in] r Red coefficient 4050 * @param[in] g Green coefficient 4051 * @param[in] b Blue coefficient 4052 * @param[in] a Alpha coefficient 4053 */ 4054 void setDotCoefficients(float r, float g, float b, float a); 4055 /** 4056 * Process an input buffer and place the histogram into the output 4057 * allocation. The output allocation may be a narrower vector size 4058 * than the input. In this case the vector size of the output is 4059 * used to determine how many of the input channels are used in 4060 * the computation. This is useful if you have an RGBA input 4061 * buffer but only want the histogram for RGB. 4062 * 4063 * 1D and 2D input allocations are supported. 4064 * 4065 * @param[in] ain The input image 4066 */ 4067 void forEach(const sp<Allocation>& ain); 4068 /** 4069 * Process an input buffer and place the histogram into the output 4070 * allocation. The dot product of the input channel and the 4071 * coefficients from 'setDotCoefficients' are used to calculate 4072 * the output values. 4073 * 4074 * 1D and 2D input allocations are supported. 4075 * 4076 * @param ain The input image 4077 */ 4078 void forEach_dot(const sp<Allocation>& ain); 4079 }; 4080 4081 /** 4082 * Intrinsic for applying a per-channel lookup table. Each channel of 4083 * the input has an independant lookup table. The tables are 256 4084 * entries in size and can cover the full value range of U8_4. 4085 **/ 4086 class ScriptIntrinsicLUT : public ScriptIntrinsic { 4087 private: 4088 sp<Allocation> LUT; 4089 bool mDirty; 4090 unsigned char mCache[1024]; 4091 void setTable(unsigned int offset, unsigned char base, unsigned int length, unsigned char* lutValues); 4092 ScriptIntrinsicLUT(sp<RS> rs, sp<const Element> e); 4093 4094 public: 4095 /** 4096 * Supported elements types are U8_4. 4097 * 4098 * The defaults tables are identity. 4099 * 4100 * @param[in] rs The RenderScript context 4101 * @param[in] e Element type for intputs and outputs 4102 * 4103 * @return ScriptIntrinsicLUT 4104 */ 4105 static sp<ScriptIntrinsicLUT> create(const sp<RS>& rs, const sp<const Element>& e); 4106 /** 4107 * Invoke the kernel and apply the lookup to each cell of ain and 4108 * copy to aout. 4109 * 4110 * @param[in] ain Input allocation 4111 * @param[in] aout Output allocation 4112 */ 4113 void forEach(const sp<Allocation>& ain, const sp<Allocation>& aout); 4114 /** 4115 * Sets entries in LUT for the red channel. 4116 * @param[in] base base of region to update 4117 * @param[in] length length of region to update 4118 * @param[in] lutValues LUT values to use 4119 */ 4120 void setRed(unsigned char base, unsigned int length, unsigned char* lutValues); 4121 /** 4122 * Sets entries in LUT for the green channel. 4123 * @param[in] base base of region to update 4124 * @param[in] length length of region to update 4125 * @param[in] lutValues LUT values to use 4126 */ 4127 void setGreen(unsigned char base, unsigned int length, unsigned char* lutValues); 4128 /** 4129 * Sets entries in LUT for the blue channel. 4130 * @param[in] base base of region to update 4131 * @param[in] length length of region to update 4132 * @param[in] lutValues LUT values to use 4133 */ 4134 void setBlue(unsigned char base, unsigned int length, unsigned char* lutValues); 4135 /** 4136 * Sets entries in LUT for the alpha channel. 4137 * @param[in] base base of region to update 4138 * @param[in] length length of region to update 4139 * @param[in] lutValues LUT values to use 4140 */ 4141 void setAlpha(unsigned char base, unsigned int length, unsigned char* lutValues); 4142 virtual ~ScriptIntrinsicLUT(); 4143 }; 4144 4145 /** 4146 * Intrinsic for performing a resize of a 2D allocation. 4147 */ 4148 class ScriptIntrinsicResize : public ScriptIntrinsic { 4149 private: 4150 sp<Allocation> mInput; 4151 ScriptIntrinsicResize(sp<RS> rs, sp<const Element> e); 4152 public: 4153 /** 4154 * Supported Element types are U8_4. Default lookup table is identity. 4155 * @param[in] rs RenderScript context 4156 * @param[in] e Element 4157 * @return new ScriptIntrinsic 4158 */ 4159 static sp<ScriptIntrinsicResize> create(const sp<RS>& rs); 4160 4161 /** 4162 * Resize copy the input allocation to the output specified. The 4163 * Allocation is rescaled if necessary using bi-cubic 4164 * interpolation. 4165 * @param[in] ain input Allocation 4166 * @param[in] aout output Allocation 4167 */ 4168 void forEach_bicubic(const sp<Allocation>& aout); 4169 4170 /** 4171 * Set the input of the resize. 4172 * @param[in] lut new lookup table 4173 */ 4174 void setInput(const sp<Allocation>& ain); 4175 }; 4176 4177 /** 4178 * Intrinsic for converting an Android YUV buffer to RGB. 4179 * 4180 * The input allocation should be supplied in a supported YUV format 4181 * as a YUV element Allocation. The output is RGBA; the alpha channel 4182 * will be set to 255. 4183 */ 4184 class ScriptIntrinsicYuvToRGB : public ScriptIntrinsic { 4185 private: 4186 ScriptIntrinsicYuvToRGB(sp<RS> rs, sp<const Element> e); 4187 public: 4188 /** 4189 * Create an intrinsic for converting YUV to RGB. 4190 * 4191 * Supported elements types are U8_4. 4192 * 4193 * @param[in] rs The RenderScript context 4194 * @param[in] e Element type for output 4195 * 4196 * @return ScriptIntrinsicYuvToRGB 4197 */ 4198 static sp<ScriptIntrinsicYuvToRGB> create(const sp<RS>& rs, const sp<const Element>& e); 4199 /** 4200 * Set the input YUV allocation. 4201 * 4202 * @param[in] ain The input allocation. 4203 */ 4204 void setInput(const sp<Allocation>& in); 4205 4206 /** 4207 * Convert the image to RGB. 4208 * 4209 * @param[in] aout Output allocation. Must match creation element 4210 * type. 4211 */ 4212 void forEach(const sp<Allocation>& out); 4213 4214 }; 4215 4216 /** 4217 * Sampler object that defines how Allocations can be read as textures 4218 * within a kernel. Samplers are used in conjunction with the rsSample 4219 * runtime function to return values from normalized coordinates. 4220 * 4221 * Any Allocation used with a Sampler must have been created with 4222 * RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE; using a Sampler on an 4223 * Allocation that was not created with 4224 * RS_ALLOCATION_USAGE_GRAPHICS_TEXTURE is undefined. 4225 **/ 4226 class Sampler : public BaseObj { 4227 private: 4228 Sampler(sp<RS> rs, void* id); 4229 Sampler(sp<RS> rs, void* id, RsSamplerValue min, RsSamplerValue mag, 4230 RsSamplerValue wrapS, RsSamplerValue wrapT, float anisotropy); 4231 RsSamplerValue mMin; 4232 RsSamplerValue mMag; 4233 RsSamplerValue mWrapS; 4234 RsSamplerValue mWrapT; 4235 float mAniso; 4236 4237 public: 4238 /** 4239 * Creates a non-standard Sampler. 4240 * @param[in] rs RenderScript context 4241 * @param[in] min minification 4242 * @param[in] mag magnification 4243 * @param[in] wrapS S wrapping mode 4244 * @param[in] wrapT T wrapping mode 4245 * @param[in] anisotropy anisotropy setting 4246 */ 4247 static sp<Sampler> create(const sp<RS>& rs, RsSamplerValue min, RsSamplerValue mag, RsSamplerValue wrapS, RsSamplerValue wrapT, float anisotropy); 4248 4249 /** 4250 * @return minification setting for the sampler 4251 */ 4252 RsSamplerValue getMinification(); 4253 /** 4254 * @return magnification setting for the sampler 4255 */ 4256 RsSamplerValue getMagnification(); 4257 /** 4258 * @return S wrapping mode for the sampler 4259 */ 4260 RsSamplerValue getWrapS(); 4261 /** 4262 * @return T wrapping mode for the sampler 4263 */ 4264 RsSamplerValue getWrapT(); 4265 /** 4266 * @return anisotropy setting for the sampler 4267 */ 4268 float getAnisotropy(); 4269 4270 /** 4271 * Retrieve a sampler with min and mag set to nearest and wrap modes set to 4272 * clamp. 4273 * 4274 * @param rs Context to which the sampler will belong. 4275 * 4276 * @return Sampler 4277 */ 4278 static sp<const Sampler> CLAMP_NEAREST(const sp<RS> &rs); 4279 /** 4280 * Retrieve a sampler with min and mag set to linear and wrap modes set to 4281 * clamp. 4282 * 4283 * @param rs Context to which the sampler will belong. 4284 * 4285 * @return Sampler 4286 */ 4287 static sp<const Sampler> CLAMP_LINEAR(const sp<RS> &rs); 4288 /** 4289 * Retrieve a sampler with mag set to linear, min linear mipmap linear, and 4290 * wrap modes set to clamp. 4291 * 4292 * @param rs Context to which the sampler will belong. 4293 * 4294 * @return Sampler 4295 */ 4296 static sp<const Sampler> CLAMP_LINEAR_MIP_LINEAR(const sp<RS> &rs); 4297 /** 4298 * Retrieve a sampler with min and mag set to nearest and wrap modes set to 4299 * wrap. 4300 * 4301 * @param rs Context to which the sampler will belong. 4302 * 4303 * @return Sampler 4304 */ 4305 static sp<const Sampler> WRAP_NEAREST(const sp<RS> &rs); 4306 /** 4307 * Retrieve a sampler with min and mag set to linear and wrap modes set to 4308 * wrap. 4309 * 4310 * @param rs Context to which the sampler will belong. 4311 * 4312 * @return Sampler 4313 */ 4314 static sp<const Sampler> WRAP_LINEAR(const sp<RS> &rs); 4315 /** 4316 * Retrieve a sampler with mag set to linear, min linear mipmap linear, and 4317 * wrap modes set to wrap. 4318 * 4319 * @param rs Context to which the sampler will belong. 4320 * 4321 * @return Sampler 4322 */ 4323 static sp<const Sampler> WRAP_LINEAR_MIP_LINEAR(const sp<RS> &rs); 4324 /** 4325 * Retrieve a sampler with min and mag set to nearest and wrap modes set to 4326 * mirrored repeat. 4327 * 4328 * @param rs Context to which the sampler will belong. 4329 * 4330 * @return Sampler 4331 */ 4332 static sp<const Sampler> MIRRORED_REPEAT_NEAREST(const sp<RS> &rs); 4333 /** 4334 * Retrieve a sampler with min and mag set to linear and wrap modes set to 4335 * mirrored repeat. 4336 * 4337 * @param rs Context to which the sampler will belong. 4338 * 4339 * @return Sampler 4340 */ 4341 static sp<const Sampler> MIRRORED_REPEAT_LINEAR(const sp<RS> &rs); 4342 /** 4343 * Retrieve a sampler with min and mag set to linear and wrap modes set to 4344 * mirrored repeat. 4345 * 4346 * @param rs Context to which the sampler will belong. 4347 * 4348 * @return Sampler 4349 */ 4350 static sp<const Sampler> MIRRORED_REPEAT_LINEAR_MIP_LINEAR(const sp<RS> &rs); 4351 4352 }; 4353 4354 } // namespace RSC 4355 4356 } // namespace android 4357 4358 #endif 4359